Objektabfragen (Entity Framework)

Die generische Klasse ObjectQuery stellt eine Abfrage dar, die eine Auflistung von null oder mehr typisierten Entitätsobjekten zurückgibt. Eine Objektabfrage gehört stets zu einem vorhandenen Objektkontext. Dieser Kontext stellt die Verbindungs- und Metadateninformationen bereit, die zum Verfassen und Ausführen der Abfrage erforderlich sind. Ein typisierter ObjectContext enthält einen Satz von Eigenschaften, die typisierte ObjectQuery-Instanzen zurückgeben. Für jeden Entitätstyp im Modell ist eine dieser Eigenschaften vorhanden. Diese Eigenschaften vereinfachen das Erstellen einer Instanz von einer typisierten ObjectQuery. Eine Objektabfrage wird in den folgenden Szenarios ausgeführt:

  • Wenn eine Aktion darauf ausgeführt wird, z. B. während einer foreach- (C#) bzw. For Each-Enumeration (Visual Basic).

  • Wenn sie zum Füllen einer List-Auflistung zugewiesen ist.

  • Wenn die Execute-Methode explizit aufgerufen wird.

  • Wenn ein LINQ-Abfrageausführungsoperator wie First oder Any aufgerufen wird. Weitere Informationen finden Sie unter Abfrage-Generator-Methoden (Entity Framework).

Die folgende Abfrage gibt ein Contact-Objekt zurück, dessen Vor- und Nachname mit den übergebenen Parametern übereinstimmt:

' Get the contacts with the specified name.
Dim contactQuery As ObjectQuery(Of Contact) = _
    context.Contact _
    .Where("it.LastName = @ln AND it.FirstName = @fn", _
    New ObjectParameter("ln", lastName), _
    New ObjectParameter("fn", firstName))
// Get the contacts with the specified name.
ObjectQuery<Contact> contactQuery = context.Contact
    .Where("it.LastName = @ln AND it.FirstName = @fn",
    new ObjectParameter("ln", lastName), 
    new ObjectParameter("fn", firstName));

Vollständige Beispiele zur Verwendung des Objektkontexts zum Verfassen und zur Ausführung von Abfragen finden Sie unter Gewusst wie: Ausführen einer Abfrage, die einen Entitätstyp zurückgibt (Entity Framework). Weitere Informationen zu Entity SQL-Abfragen finden Sie unter Entity SQL-Sprache.

Abfrageprojektion

Objektabfragen werden einerseits verwendet, um Entitätsdatenmodell (EDM)-Daten als Entitätsobjekte zurückzugeben. Sie unterstützen jedoch auch Projektionen, die Daten zurückgeben, die nicht ohne weiteres in Entitätstypen materialisiert werden können. ObjectQuery verwendet den DbDataRecord-Typ für Projektionen, die keine Entitätstypen sondern geschachtelte Ergebnisse oder anonyme Typen zurückgeben. Einfache Typen wie Int32 oder String werden mit Projektionen verwendet, die einzelne Eigenschaftswerte zurückgeben.

Die Abfrage-Generator-Methode Select gibt eine ObjectQuery zurück, die bei der Ausführung eine Auflistung von DbDataRecord-Objekten zurückgibt. Sowohl LINQ-to-Entities als auch Entity SQL unterstützen Abfrageprojektion. Beispiele für Abfrageprojektion finden Sie in den folgenden Themen:

Folgende Aspekte sollten bei der Abfrageprojektion beachtet werden:

  • Eine ObjectQuery kann so initialisiert werden, dass sie ein einzelnes skalares Ergebnis und keine Auflistung von skalaren Ergebnissen darstellt. Einige Erweiterungsmethoden erfordern Auflistungsergebnisse als Eingabe. In diesem Fall wird eine ArgumentException ausgelöst, wenn eine dieser Methoden angerufen wird, wie in folgendem Beispiel.

    ' Define a query projection that returns 
    ' a single scalar value rather than a collection.
    Dim scalarQuery As ObjectQuery(Of Int32) = _
        New ObjectQuery(Of Int32)("100", advWorksContext)
    
    ' Calling an extension method that requires a collection
    ' will result in an exception.
    Dim hasValues As Boolean = scalarQuery.Any()
    
    // Define a query projection that returns 
    // a single scalar value rather than a collection.
    ObjectQuery<Int32> scalarQuery = 
        new ObjectQuery<Int32>("100", advWorksContext);
    
    // Calling an extension method that requires a collection
    // will result in an exception.
    bool hasValues = scalarQuery.Any(); 
    
  • Wenn eine ObjectQuery möglicherweise bei der Projektion auf einen primitiven Typ einen null-Wert zurückgibt, sollte die Version des Typs verwendet werden, die NULL-Werte zulässt. In der folgenden Abfrage wird ein DateTime verwendet, das NULL-Werte zulässt, da die ShipDate-Eigenschaft des SalesOrderHeader-Objekts möglicherweise einen null-Wert zurückgibt.

    Dim shipDateQuery As ObjectQuery(Of Nullable(Of Date)) = _
    advWorksContext.SalesOrderHeader _
        .Where("it.CustomerID = @contactId", _
            New ObjectParameter("contactId", contactId)) _
        .SelectValue(Of Nullable(Of Date))("it.ShipDate")
    
    ObjectQuery<Nullable<DateTime>> shipDateQuery =
        advWorksContext.SalesOrderHeader
        .Where("it.CustomerID = @contactId",
            new ObjectParameter("contactId", contactId))
        .SelectValue<Nullable<DateTime>>("it.ShipDate");
    

    Weitere Informationen finden Sie unter Typen, die NULL-Werte zulassen, (Visual Basic-Programmierhandbuch) oder Typen, die NULL-Werte zulassen (C#-Programmierhandbuch).

Festlegen des Befehlstimeouts

Das Standardtimeout für Objektabfragen und den SaveChanges-Vorgang wird vom zugrunde liegenden Verbindungsanbieter definiert. Sie können diesen Standardtimeout jedoch mithilfe der CommandTimeout-Eigenschaft im ObjectContext überschreiben (siehe folgendes Beispiel).

' Specify a timeout for queries in this context, in seconds.
context.CommandTimeout = 120
// Specify a timeout for queries in this context, in seconds.
context.CommandTimeout = 120;

Dieses Vorgehen wird empfohlen, wenn eine komplexe Abfrage durchgeführt wird, oder wenn andere Leistungsprobleme dazu führen, dass Abfragen oder Aufrufe von SaveChanges häufig zu einem Timeout führen.

Anzeigen von Speicherbefehlen

Beim Abfragen eines EDM wandelt Entity Framework auf dem EDM basierende LINQ to Entities- und Entity SQL-Abfragen in entsprechende Abfragen der Datenquelle um. Object Services stellt die ToTraceString-Methode bereit, mit der diese Speicherbefehle für eine ObjectQuery zur Laufzeit angezeigt werden können, ohne in der Datenquelle eine Ablaufverfolgung durchführen zu müssen. Der EntityClient-Anbieter stellt auch eine EntityCommand-Methode für ToTraceString bereit. Weitere Informationen finden Sie unter Gewusst wie: Anzeigen der Speicherbefehle (Entity Framework).

Abrufen eines Objekts anhand des EntityKey

Wenn der Schlüsselwert einer Entität bekannt ist, kann diese aus der Datenquelle abgerufen werden, ohne eine Objektabfrage zu erstellen und auszuführen. Die GetObjectByKey-Methode und die TryGetObjectByKey-Methode des ObjectContext geben ein Objekt mit dem angegebenen EntityKey in den Objektkontext zurück. Bei der Verwendung von GetObjectByKey muss eine ObjectNotFoundException behandelt werden, wenn der bereitgestellte EntityKey zu keiner vorhandenen Entität gehört. Weitere Informationen finden Sie unter Gewusst wie: Zurückgeben eines bestimmten Objekts mithilfe seines Schlüssels (Entity Framework).

Siehe auch

Konzepte

Abfragen von Daten als Objekte (Entity Framework)