Share via


Abfrageprojektionen (WCF Data Services)

Die Projektion stellt in Open Data Protocol (OData) einen Mechanismus bereit, mit dem sich die von einer Abfrage zurückgegebene Datenmenge im Feed reduzieren lässt, indem angegeben wird, dass nur bestimmte Eigenschaften einer Entität in der Antwort zurückgegeben werden sollen. Weitere Informationen finden Sie unter OData.

In diesem Thema wird beschrieben, wie eine Abfrageprojektion definiert wird, welche Anforderungen Entitäts- und Nicht-Entitätstypen erfüllen müssen, wie projizierte Ergebnisse aktualisiert werden, wie projizierte Typen erstellt werden und was bei Projektionen zu berücksichtigen ist.

Definieren einer Abfrageprojektion

Sie können entweder mit der $select-Abfrageoption in einem URI oder mit der select-Klausel (Select in Visual Basic) in einer LINQ-Abfrage einer Abfrage eine Projektionsklausel hinzufügen. Zurückgegebene Entitätsdaten können auf dem Client entweder in Entitätstypen oder in Nicht-Entitätstypen projiziert werden. In den Beispielen in diesem Thema wird gezeigt, wie die select-Klausel in einer LINQ-Abfrage verwendet wird.

Ee473425.Important(de-de,VS.100).gif Hinweis:
Im Datendienst können Datenverluste auftreten, wenn Sie Aktualisierungen speichern, die an projizierten Typen vorgenommen wurden.Weitere Informationen finden Sie unter Projection Considerations.

Anforderungen für Entitäts- und Nicht-Entitätstypen

Entitätstypen müssen eine oder mehrere IDENTITY-Eigenschaften besitzen, die den Entitätsschlüssel bilden. Entitätstypen werden unter Verwendung einer der folgenden Methoden auf Clients definiert:

  • Durch Anwenden des DataServiceKeyAttribute-Attributs oder DataServiceEntityAttribute-Attributs auf den Typ.

  • Wenn der Typ über eine Eigenschaft mit dem Namen ID verfügt.

  • Wenn der Typ eine Eigenschaft namens typeID besitzt, wobei type für den Namen des Typs steht.

In der Standardeinstellung gilt, wenn Sie Projektabfrageergebnisse in einen auf dem Client definierten Typ projizieren, dann müssen die in der Projektion angeforderten Eigenschaften im Clienttyp vorhanden sein. Wenn Sie jedoch den Wert true für die IgnoreMissingProperties-Eigenschaft des DataServiceContext-Kontexts angeben, müssen die in der Projektion angegebenen Eigenschaften nicht im Clienttyp vorhanden sein.

Vornehmen von Aktualisierungen an projizierten Ergebnissen

Wenn Sie Projektabfrageergebnisse auf dem Client in Entitätstypen projizieren, dann kann der DataServiceContext-Kontext aktualisierte Objekte verfolgen, die zum Datendienst zurückgeschickt werden sollen, wenn die SaveChanges-Methode aufgerufen wird. Aktualisierungen, die an Daten vorgenommen werden, die auf dem Client in Nicht-Entitätstypen projiziert wurden, können jedoch nicht an den Datendienst zurückgesendet werden. Der Grund hierfür ist, dass der Datendienst ohne Schlüssel zum Identifizieren der Entitätsinstanz nicht die richtige Entität in der Datenquelle aktualisieren kann. Nicht-Entitätstypen werden nicht an den DataServiceContext angefügt.

Wenn eine oder mehrere Eigenschaften eines Entitätstyps, der im Datendienst definiert wurde, nicht im Clienttyp vorhanden sind, in den die Entität projiziert wird, dann enthalten neu eingefügte Entitäten diese fehlenden Eigenschaften nicht. In diesem Fall werden diese fehlenden Eigenschaften auch nicht bei Aktualisierungen berücksichtigt, die an vorhandenen Entitäten vorgenommen werden. Wenn ein Wert für eine solche Eigenschaft vorhanden ist, dann wird er während der Aktualisierung auf den Standardwert der Eigenschaft zurückgesetzt, der in der Datenquelle definiert ist.

Erstellen von projizierten Typen

Im folgenden Beispiel wird eine anonyme LINQ-Abfrage verwendet, die die adressenbezogenen Eigenschaften des Customers-Typs in einen neuen CustomerAddress-Typ projiziert, der auf dem Client definiert und als Entitätstyp deklariert wurde:

' 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}
// 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};

In diesem Beispiel wird das Objektinitialisierermuster statt eines Konstruktoraufrufs verwendet, um eine neue Instanz des CustmerAddress-Typs zu erstellen. Beim Projizieren in Entitätstypen werden Konstruktoren nicht unterstützt, beim Projizieren in Nicht-Entitätstypen und anonyme Typen können sie jedoch verwendet werden. Da CustomerAddress ein Entitätstyp ist, können Änderungen vorgenommen werden und an den Datendienst zurückgesendet werden.

Auch werden die Daten vom Customer-Typ in eine Instanz des CustomerAddress-Entitätstyps statt eines anonymen Typs projiziert. Die Projektion auf anonyme Typen wird unterstützt, die Daten sind jedoch schreibgeschützt, weil anonyme Typen wie Nicht-Entitätstypen behandelt werden.

Die MergeOption-Einstellungen des DataServiceContext-Kontexts werden während der Abfrageprojektion zur Identitätsauflösung verwendet. Wenn eine Instanz des Customer-Typs bereits im DataServiceContext-Kontext vorhanden ist, dann folgt eine Instanz von CustomerAddress mit der gleichen Identität dem Identitätsauflösungsregelsatz vom MergeOption.

In der folgenden Tabelle wird das Verhalten beim Projizieren von Ergebnissen in Entitäts- und Nicht-Entitätstypen beschrieben:

Aktion Entitätstyp Nicht-Entitätstyp

Erstellen einer neuen projizierten Instanz mit Initialisierern, wie im folgenden Beispiel:

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}
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};

Wird unterstützt

Wird unterstützt

Erstellen einer neuen projizierten Instanz mit Konstruktoren, wie im folgenden Beispiel:

Dim query = From c In context.Customers _
                Where c.Country = "Germany" _
                Select New CustomerAddress( _
                c.CustomerID, _
                c.Address, _
                c.City, _
                c.Region, _
                c.PostalCode, _
                c.Country)
var query = from c in context.Customers
            where c.Country == "Germany"
            select new CustomerAddress(
            c.CustomerID, 
            c.Address, 
            c.City, 
            c.Region,
            c.PostalCode, 
            c.Country);

Es wird eine Ausnahme vom Typ NotSupportedException ausgelöst.

Wird unterstützt

Verwenden der Projektion, um einen Eigenschaftswert, wie im folgenden Beispiel, zu transformieren:

Dim query = From c In context.Customers _
                Where c.Country = "Germany" _
                Select New CustomerAddress With _
                {.CustomerID = c.CustomerID, _
                    .Address = "Full address: " & c.Address & ", " & _
                    c.City & "," & c.Region & " " & c.PostalCode, _
                    .City = c.City, _
                    .Region = c.Region, _
                    .PostalCode = c.PostalCode, _
                    .Country = c.Country}
var query = from c in context.Customers
            where c.Country == "Germany"
            select new CustomerAddress
            {
                CustomerID = c.CustomerID, 
                Address = "Full address:" + c.Address + ", " +
                c.City + ", " + c.Region + " " + c.PostalCode,
                City = c.City,
                Region = c.Region,
                PostalCode = c.PostalCode,
                Country = c.Country
            };

Diese Transformation wird für Entitätstypen nicht unterstützt, da sie zu Verwirrung und potenziell zum Überschreiben von Daten in der Datenquelle führen kann, die zu einer anderen Entität gehören.

Es wird eine Ausnahme vom Typ NotSupportedException ausgelöst.

Wird unterstützt

Überlegungen zur Projektion

Beim Definieren einer Abfrageprojektion sind außerdem die folgenden Punkte zu berücksichtigen.

  • Wenn Sie benutzerdefinierte Feeds für das Atom-Format definieren, müssen Sie sicherstellen, dass alle Entitätseigenschaften, für die benutzerdefinierte Zuordnungen definiert wurden, in der Projektion enthalten sind. Wenn eine zugeordnete Entitätseigenschaft nicht in der Projektion enthalten ist, könnten Datenverluste auftreten. Weitere Informationen finden Sie unter Feedanpassung (WCF Data Services).

  • Wenn Entitäten in einen projizierten Typ eingefügt werden, der nicht alle Eigenschaften der Entität im Datenmodell des Datendiensts umfasst, werden die in der Projektion in den Client nicht enthaltenen Eigenschaften auf ihre Standardwerte festgelegt.

  • Wenn Aktualisierungen an einem projizierten Typ vorgenommen werden, der nicht alle Eigenschaften der Entität im Datenmodell des Datendiensts umfasst, werden vorhandene Werte, die in der Projektion auf dem Client nicht enthalten sind, mit den nicht initialisierten Standardwerten überschrieben.

  • Wenn eine Projektion eine komplexe Eigenschaft beinhaltet, muss das gesamte komplexe Objekt zurückgegeben werden.

  • Wenn eine Projektion eine Navigationseigenschaft umfasst, werden die verknüpften Objekte implizit geladen, ohne dass die Expand-Methode aufgerufen werden muss. Die Expand-Methode kann in projizierten Abfragen nicht verwendet werden.

  • Abfragen mit Abfrageprojektionen für den Client werden übersetzt, sodass die $select-Abfrageoption im Anforderungs-URI verwendet wird. Wenn eine Abfrage mit Projektion für eine frühere Version von WCF Data Services ausgeführt wird, welche die $select-Abfrageoption nicht unterstützt, wird ein Fehler zurückgegeben. Dies kann auch geschehen, wenn die MaxProtocolVersion-Eigenschaft des DataServiceBehavior-Objekts für den Datendienst auf den Wert V1 festgelegt wird. Weitere Informationen finden Sie unter Verwenden mehrerer Versionen von WCF Data Services.

Weitere Informationen finden Sie unter Gewusst wie: Projizieren von Abfrageergebnissen (WCF Data Services).

Siehe auch

Konzepte

Abfragen des Datendiensts (WCF Data Services)