方法: クエリ結果を射影する (WCF Data Services)
射影は、エンティティの特定のプロパティのみが応答で返されるように指定することにより、クエリによって返されるデータの量を減らすためのメカニズムです。 クエリの結果に射影を実行するには、$select クエリ オプションを使用するか、LINQ クエリで select 句 (Visual Basic の場合は Select) を使用します。 詳細については、「データ サービスのクエリ (WCF Data Services)」を参照してください。
このトピックの例では、Northwind サンプル データ サービスおよび自動生成されたクライアント データ サービス クラスを使用します。 このサービスおよびクライアント データ クラスは、WCF Data Services クイック スタートを完了したときに作成されます。
例
次の例では、アドレス特有のプロパティと Identity プロパティのみを含む新しい CustomerAddress 型に Customer エンティティを射影する LINQ クエリを示します。 この CustomerAddress クラスはクライアントで定義され、クライアント ライブラリがエンティティ型として認識できるように属性化されています。
' Create the DataServiceContext using the service URI.
Dim context = New NorthwindEntities(svcUri)
' Define an anonymous LINQ query that projects the Customers type into
' a CustomerAddress type that contains only address properties.
Dim query = From c In context.Customers _
Where c.Country = "Germany" _
Select New CustomerAddress With { _
.CustomerID = c.CustomerID, _
.Address = c.Address, _
.City = c.City, _
.Region = c.Region, _
.PostalCode = c.PostalCode, _
.Country = c.Country}
Try
' Enumerate over the query result, which is executed implicitly.
For Each item In query
' Modify the address and mark the object as updated.
item.Address += " #101"
context.UpdateObject(item)
' Write out the current values.
Console.WriteLine("Customer ID: {0} \r\nStreet: {1} " _
& "\r\nCity: {2} \r\nState: {3} \r\nZip Code: {4} \r\nCountry: {5}", _
item.CustomerID, item.Address, item.City, item.Region, _
item.PostalCode, item.Country)
Next
' Save changes to the data service.
context.SaveChanges()
Catch ex As DataServiceQueryException
Throw New ApplicationException( _
"An error occurred during query execution.", ex)
End Try
// Create the DataServiceContext using the service URI.
NorthwindEntities context = new NorthwindEntities(svcUri);
// Define an anonymous LINQ query that projects the Customers type into
// a CustomerAddress type that contains only address properties.
var query = from c in context.Customers
where c.Country == "Germany"
select new CustomerAddress {
CustomerID = c.CustomerID,
Address = c.Address,
City = c.City,
Region = c.Region,
PostalCode = c.PostalCode,
Country = c.Country};
try
{
// Enumerate over the query result, which is executed implicitly.
foreach (var item in query)
{
// Modify the address and mark the object as updated.
item.Address += " #101";
context.UpdateObject(item);
// Write out the current values.
Console.WriteLine("Customer ID: {0} \r\nStreet: {1} "
+ "\r\nCity: {2} \r\nState: {3} \r\nZip Code: {4} \r\nCountry: {5}",
item.CustomerID, item.Address, item.City, item.Region,
item.PostalCode, item.Country);
}
// Save changes to the data service.
context.SaveChanges();
}
catch (DataServiceQueryException ex)
{
throw new ApplicationException(
"An error occurred during query execution.", ex);
}
次の例では、返された Customers エンティティを、Identity プロパティは含まずにアドレス特有のプロパティのみを含む新しい CustomerAddressNonEntity 型に射影する LINQ クエリを示します。 この CustomerAddressNonEntity クラスはクライアントで定義され、エンティティ型としては属性化されません。
' Create the DataServiceContext using the service URI.
Dim context = New NorthwindEntities(svcUri)
' Define an anonymous LINQ query that projects the Customers type into
' a CustomerAddress type that contains only address properties.
Dim query = From c In context.Customers _
Where c.Country = "Germany" _
Select New CustomerAddressNonEntity With _
{.CompanyName = c.CompanyName, _
.Address = c.Address, _
.City = c.City, _
.Region = c.Region, _
.PostalCode = c.PostalCode, _
.Country = c.Country}
Try
' Enumerate over the query result, which is executed implicitly.
For Each item In query
item.Address += "Street"
Console.WriteLine("Company name: {0} \nStreet: {1} " _
& "\nCity: {2} \nState: {3} \nZip Code: {4} \nCountry: {5}", _
item.CompanyName, item.Address, item.City, item.Region, _
item.PostalCode, item.Country)
Next
Catch ex As DataServiceQueryException
Throw New ApplicationException( _
"An error occurred during query execution.", ex)
End Try
// Create the DataServiceContext using the service URI.
NorthwindEntities context = new NorthwindEntities(svcUri);
// Define an anonymous LINQ query that projects the Customers type into
// a CustomerAddress type that contains only address properties.
var query = from c in context.Customers
where c.Country == "Germany"
select new CustomerAddressNonEntity
{
CompanyName = c.CompanyName,
Address = c.Address,
City = c.City,
Region = c.Region,
PostalCode = c.PostalCode,
Country = c.Country
};
try
{
// Enumerate over the query result, which is executed implicitly.
foreach (var item in query)
{
item.Address += "Street";
Console.WriteLine("Company name: {0} \nStreet: {1} "
+ "\nCity: {2} \nState: {3} \nZip Code: {4} \nCountry: {5}",
item.CompanyName, item.Address, item.City, item.Region,
item.PostalCode, item.Country);
}
}
catch (DataServiceQueryException ex)
{
throw new ApplicationException(
"An error occurred during query execution.", ex);
}
次の例では、前の例で使用した CustomerAddress CustomerAddressNonEntity 型の定義を示します。
<DataServiceKey("CustomerID")> _
Partial Public Class CustomerAddress
Private _customerID As String
Private _address As String
Private _city As String
Private _region As String
Private _postalCode As String
Private _country As String
Public Property CustomerID() As String
Get
Return Me._customerID
End Get
Set(ByVal value As String)
Me._customerID = Value
End Set
End Property
Public Property Address() As String
Get
Return Me._address
End Get
Set(ByVal value As String)
Me._address = Value
End Set
End Property
Public Property City() As String
Get
Return Me._city
End Get
Set(ByVal value As String)
Me._city = Value
End Set
End Property
Public Property Region() As String
Get
Return Me._region
End Get
Set(ByVal value As String)
Me._region = Value
End Set
End Property
Public Property PostalCode() As String
Get
Return Me._postalCode
End Get
Set(ByVal value As String)
Me._postalCode = Value
End Set
End Property
Public Property Country() As String
Get
Return Me._country
End Get
Set(ByVal value As String)
Me._country = value
End Set
End Property
End Class
Public Class CustomerAddressNonEntity
Private _companyName As String
Private _address As String
Private _city As String
Private _region As String
Private _postalCode As String
Private _country As String
Public Property CompanyName() As String
Get
Return Me._companyName
End Get
Set(ByVal value As String)
Me._companyName = value
End Set
End Property
Public Property Address() As String
Get
Return Me._address
End Get
Set(ByVal value As String)
Me._address = Value
End Set
End Property
Public Property City() As String
Get
Return Me._city
End Get
Set(ByVal value As String)
Me._city = Value
End Set
End Property
Public Property Region() As String
Get
Return Me._region
End Get
Set(ByVal value As String)
Me._region = Value
End Set
End Property
Public Property PostalCode() As String
Get
Return Me._postalCode
End Get
Set(ByVal value As String)
Me._postalCode = Value
End Set
End Property
Public Property Country() As String
Get
Return Me._country
End Get
Set(ByVal value As String)
Me._country = value
End Set
End Property
End Class
[DataServiceKey("CustomerID")]
public partial class CustomerAddress
{
private string _customerID;
private string _address;
private string _city;
private string _region;
private string _postalCode;
private string _country;
public string CustomerID
{
get
{
return this._customerID;
}
set
{
this._customerID = value;
}
}
public string Address
{
get
{
return this._address;
}
set
{
this._address = value;
}
}
public string City
{
get
{
return this._city;
}
set
{
this._city = value;
}
}
public string Region
{
get
{
return this._region;
}
set
{
this._region = value;
}
}
public string PostalCode
{
get
{
return this._postalCode;
}
set
{
this._postalCode = value;
}
}
public string Country
{
get
{
return this._country;
}
set
{
this._country = value;
}
}
}
public class CustomerAddressNonEntity
{
private string _companyName;
private string _address;
private string _city;
private string _region;
private string _postalCode;
private string _country;
public string CompanyName
{
get
{
return this._companyName;
}
set
{
this._companyName = value;
}
}
public string Address
{
get
{
return this._address;
}
set
{
this._address = value;
}
}
public string City
{
get
{
return this._city;
}
set
{
this._city = value;
}
}
public string Region
{
get
{
return this._region;
}
set
{
this._region = value;
}
}
public string PostalCode
{
get
{
return this._postalCode;
}
set
{
this._postalCode = value;
}
}
public string Country
{
get
{
return this._country;
}
set
{
this._country = value;
}
}
}