Gewusst wie: Projizieren von Abfrageergebnissen (WCF Data Services)
Die Projektion stellt einen Mechanismus bereit, mit dem sich die von einer Abfrage zurückgegebene Datenmenge reduzieren lässt, indem angegeben wird, dass nur bestimmte Eigenschaften einer Entität in der Antwort zurückgegeben werden sollen. Sie können entweder Projektionen auf den Ergebnissen einer WCF Data Services -Abfrage ausführen, indem Sie entweder die $select-Abfrageoption oder die select-Klausel (Select in Visual Basic) in einer LINQ-Abfrage angeben. Weitere Informationen finden Sie unter Abfragen des Datendiensts (WCF Data Services).
Im Beispiel in diesem Thema werden der Northwind-Beispieldatendienst und automatisch generierte Clientdatendienstklassen verwendet. Dieser Dienst und die Clientdatenklassen werden erstellt, wenn Sie den WCF Data Services-Schnellstart ausführen.
Beispiel
Im folgenden Beispiel wird eine LINQ-Abfrage veranschaulicht, die Customers-Entitäten in den neuen CustomerAddress-Typ projiziert, der nur adressenspezifische Eigenschaften und die IDENTITY-Eigenschaft enthält. Diese CustomerAddress-Klasse wird auf dem Client definiert und so zugeordnet, dass die Clientbibliothek ihn als Entitätstyp erkennen kann.
' 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);
}
Im folgenden Beispiel wird eine LINQ-Abfrage gezeigt, die zurückgegebene Customers-Entitäten in einen neuen CustomerAddressNonEntity-Typ projiziert, der nur adressenspezifische Eigenschaften und keine IDENTITY-Eigenschaft enthält. Diese CustomerAddressNonEntity-Klasse wird auf dem Client definiert und nicht als Entitätstyp ausgezeichnet.
' 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);
}
Das folgende Beispiel veranschaulicht die Definitionen der CustomerAddress CustomerAddressNonEntity-Typen, die in den vorherigen Beispielen verwendet wurden.
<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;
}
}
}