Sdílet prostřednictvím


Abfrage-Generator-Methoden (Entity Framework)

Die ObjectQuery-Klasse unterstützt sowohl LINQ-to-Entities als auch Entity SQL-Abfragen für ein Entitätsdatenmodell (EDM). Außerdem implementiert ObjectQuery einen Satz an Abfrage-Generator-Methoden, mit denen Entity SQL ähnliche Abfragebefehle sequenziell erstellt werden können. Im Folgenden sind die Abfrage-Generator-Methoden von ObjectQuery mit den entsprechenden Entity SQL-Anweisungen aufgeführt:

ObjectQuery-Methode Entity SQL-Anweisung

Distinct

DISTINCT

Except

EXCEPT

GroupBy

GROUP BY

Intersect

INTERSECT

OfType

OFTYPE

OrderBy

ORDER BY

Select

SELECT

SelectValue

SELECT VALUE

Skip

SKIP

Top

TOP und LIMIT

Union

UNION

UnionAll

UNION ALL

Where

WHERE

Jede Abfrage-Generator-Methode gibt eine neue Instanz von ObjectQuery zurück. Dadurch können Sie eine Abfrage erstellen, deren Resultset auf bereits ausgeführten ObjectQuery-Instanzen basiert. Im folgenden Beispiel wird die Verwendung der Where-Methode zum Filtern zurückgegebener Product-Objekte nach ProductID veranschaulicht.

' Return Product objects with the specified ID.
Dim query As ObjectQuery(Of Product) = _
advWorksContext.Product _
.Where("it.ProductID = @product", _
New ObjectParameter("product", productId))
// Return Product objects with the specified ID.
ObjectQuery<Product> query =
    advWorksContext.Product
    .Where("it.ProductID = @product", 
    new ObjectParameter("product", productId));

Da eine ObjectQueryIQueryable und IEnumerable implementiert, können die von ObjectQuery implementierten Abfrage-Generator-Methoden mit LINQ-spezifischen Standardabfrageoperator-Methoden wie First oder Count kombiniert werden. Im Gegensatz zu Abfrage-Generator-Methoden wird von LINQ-Operatoren kein ObjectQuery zurückgegeben. Weitere Informationen finden Sie in der Visual Studio 2008-Dokumentation unter dem Thema Übersicht über Standardabfrageoperatoren.

Auswählen von Daten

In der Standardeinstellung werden von einer ObjectQuery 0 (null) oder mehr Entitätsobjekte eines bestimmten Typs zurückgegeben. Durch das Aufrufen weiterer Abfragemethoden wie Where und OrderBy wird die von der ursprünglichen ObjectQuery zurückgegebene Auflistung mit Objekten beeinflusst. Einige Methoden wie Select und GroupBy geben statt eines Entitätstyps eine Projektion der Daten als DbDataRecord zurück. Weitere Informationen finden Sie unter Objektabfragen (Entity Framework). Im folgenden Beispiel wird eine Auflistung von DbDataRecord-Objekten zurückgegeben, die geschachtelte SalesOrderHeader-Entitätstypen enthält.

' Define a query that returns a nested 
' DbDataRecord for the projection.
Dim query As ObjectQuery(Of DbDataRecord) = _
    advWorksContext.Contact.Select("it.FirstName, " _
        + "it.LastName, it.SalesOrderHeader") _
    .Where("it.LastName = 'Zhou'")
// Define a query that returns a nested 
// DbDataRecord for the projection.
ObjectQuery<DbDataRecord> query =
    advWorksContext.Contact.Select("it.FirstName, "
        + "it.LastName, it.SalesOrderHeader")
    .Where("it.LastName = 'Zhou'");

Obwohl Abfrage-Generator-Methoden sequenziell angewendet werden, ist es möglich, dieselbe Art von geschachtelten Unterabfragen zu erstellen, die von Entity SQL unterstützt werden. Hierzu müssen Sie in der Methode die Unterabfrage als Entity SQL angeben. Im folgenden Beispiel wird eine Entity SQL SELECT-Unterabfrage in der Select-Methode verwendet, um LastName-Datensätze in einem Resultset geschachtelt und alphabetisch nach dem ersten Buchstaben des Nachnamens sortiert einzuschließen:

' Define the query with a GROUP BY clause that returns
' a set of nested LastName records grouped by first letter.
Dim query As ObjectQuery(Of DbDataRecord) = _
advWorksContext.Contact _
.GroupBy("SUBSTRING(it.LastName, 1, 1) AS ln", "ln") _
.Select("it.ln AS ln, (SELECT c1.LastName " + _
"FROM AdventureWorksEntities.Contact AS c1 " + _
"WHERE SubString(c1.LastName, 1, 1) = it.ln) AS CONTACT") _
.OrderBy("it.ln")
// Define the query with a GROUP BY clause that returns
// a set of nested LastName records grouped by first letter.
ObjectQuery<DbDataRecord> query =
    advWorksContext.Contact
    .GroupBy("SUBSTRING(it.LastName, 1, 1) AS ln", "ln")    
    .Select("it.ln AS ln, (SELECT c1.LastName " +
    "FROM AdventureWorksEntities.Contact AS c1 " +
    "WHERE SubString(c1.LastName, 1, 1) = it.ln) AS CONTACT")
    .OrderBy("it.ln");
NoteHinweis

Mit der ToTraceString-Methode kann der von einer ObjectQuery für die Datenquelle generierte Befehl angezeigt werden. Weitere Informationen finden Sie unter Objektabfragen (Entity Framework).

Aliase

Abfrage-Generator-Methoden werden sequenziell angewendet, um einen kumulativen Abfragebefehl zu erstellen. Dies bedeutet, dass der aktuelle ObjectQuery-Befehl als Unterabfrage behandelt wird, auf die die aktuelle Methode angewendet wird.

NoteHinweis

Die CommandText-Eigenschaft gibt den Befehl für die ObjectQuery zurück.

In einer Abfrage-Generator-Methode können Sie sich mit einem Alias auf den aktuellen ObjectQuery-Befehl beziehen. Standardmäßig dient wie im folgenden Beispiel die Zeichenfolge "it" als Alias für den aktuellen Befehl:

' Return Product objects with a standard cost
' above $10.
Dim productQuery As ObjectQuery(Of Product) = _
advWorksContext.Product _
    .Where("it.StandardCost > 10")
// Return Product objects with a standard cost
// above $10.
ObjectQuery<Product> productQuery =
    advWorksContext.Product
    .Where("it.StandardCost > 10");

Wenn Sie die Name-Eigenschaft einer ObjectQuery festlegen, dient dieser Wert in nachfolgenden Methoden als Alias. Im folgenden Beispiel wird das vorhergehende Beispiel erweitert, indem der Name der ObjectQuery auf "product" festgelegt und dieser Alias anschließend in der nachfolgenden OrderBy-Methode verwendet wird:

' Return Product objects with a standard cost
' above $10.
Dim productQuery As ObjectQuery(Of Product) = _
advWorksContext.Product _
    .Where("it.StandardCost > 10")

'Set the Name property for the query and then 
' use that name as the alias in the subsequent 
' OrderBy method.
productQuery.Name = "product"
Dim filteredProduct As ObjectQuery(Of Product) = _
productQuery.OrderBy("product.ProductID")
// Return Product objects with a standard cost
// above $10.
ObjectQuery<Product> productQuery =
    advWorksContext.Product
    .Where("it.StandardCost > 10");

// Set the Name property for the query and then 
// use that name as the alias in the subsequent 
// OrderBy method.
productQuery.Name = "product";
ObjectQuery<Product> filteredProduct = productQuery
    .OrderBy("product.ProductID");

Parameter

Alle Abfrage-Generator-Methoden, die als Eingabe eine Entity SQL-Zeichenfolge annehmen, unterstützen auch parametrisierte Abfragen. Parameternamen in Entity SQL werden in Abfrageausdrücken mit einem "at" (@)-Symbol als Präfix definiert. Weitere Informationen finden Sie unter Parameter (Entity SQL). Parameter werden als Array von ObjectParameter-Instanzen an Abfrage-Generator-Methoden übergeben. Im folgenden Beispiel werden der Where-Methode zwei Parameter übergeben:

' 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));

Überlegungen zum Verwenden von Parametern

Beim Verwenden von Parametern mit Abfrage-Generator-Methoden sollten die folgenden Punkte beachtet werden:

  • Die an Abfrage-Generator-Methoden übergebenen Parameter werden in der Folge von aufeinander folgenden Instanzen einer ObjectQuery aggregiert. Auf sie kann mit der Parameters-Eigenschaft zugegriffen werden. Solange die Abfrage nicht kompiliert oder ausgeführt wurde, können Sie Parameter nach dem Hinzufügen aus der Auflistung entfernen und die Auflistung löschen. Parameternamen können nicht geändert werden, Werte können jedoch jederzeit geändert werden.

  • Die Parameter müssen in der ObjectParameterCollection eindeutig sein. Es können sich nicht zwei Parameter mit demselben Namen in der Auflistung befinden.

  • Bei Zusammensetzungsmethoden wie Union, UnionAll, Intersect und Except werden die Parameterauflistungen zusammengeführt. Es wird eine Ausnahme ausgelöst, wenn die Parametersätze inkompatibel oder unvollständig sind bzw. wenn in den Parameterauflistungen beider Abfragen derselbe Name vorkommt.

Siehe auch

Konzepte

Abfragen von Daten als Objekte (Entity Framework)
Strukturieren von Abfrageergebnissen (Entity Framework)

Weitere Ressourcen

Abfragen eines Entity Data Model (Entity Framework-Aufgaben)