Abfrage-Generator-Methoden (Entity Framework)
Die ObjectQuery-Klasse unterstützt LINQ to Entities - und Entity SQL -Abfragen in einem konzeptionellen Modell. ObjectQuery implementiert außerdem eine Reihe von Abfrage-Generator-Methoden, die zur sequentiellen Erstellung von Abfragebefehlen, die Entity SQL entsprechen, verwendet 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 |
---|---|
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) = context.Products.Where("it.ProductID = @product", New ObjectParameter("product", productId))
// Return Product objects with the specified ID.
ObjectQuery<Product> query =
context.Products
.Where("it.ProductID = @product",
new ObjectParameter("product", productId));
Da eine ObjectQuery IQueryable 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) = context.Contacts.Select("it.FirstName, it.LastName, it.SalesOrderHeaders") _
.Where("it.LastName = @ln", New ObjectParameter("ln", lastName))
// Define a query that returns a nested
// DbDataRecord for the projection.
ObjectQuery<DbDataRecord> query =
context.Contacts.Select("it.FirstName, "
+ "it.LastName, it.SalesOrderHeaders")
.Where("it.LastName = @ln", new ObjectParameter("ln", lastName));
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) = _
context.Contacts.GroupBy("SUBSTRING(it.LastName, 1, 1) AS ln", "ln") _
.Select("it.ln AS ln, (SELECT c1.LastName FROM AdventureWorksEntities.Contacts 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 =
context.Contacts
.GroupBy("SUBSTRING(it.LastName, 1, 1) AS ln", "ln")
.Select("it.ln AS ln, (SELECT c1.LastName " +
"FROM AdventureWorksEntities.Contacts AS c1 " +
"WHERE SubString(c1.LastName, 1, 1) = it.ln) AS CONTACT")
.OrderBy("it.ln");
Hinweis: |
---|
Mit der ToTraceString-Methode kann der Datenquellenbefehl angezeigt werden, der von einem ObjectQuery erstellt wird.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.
Hinweis: |
---|
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 dollars.
Dim cost = 10
Dim productQuery As ObjectQuery(Of Product) = context.Products.Where("it.StandardCost > @cost")
productQuery.Parameters.Add(New ObjectParameter("cost", cost))
int cost = 10;
// Return Product objects with a standard cost
// above 10 dollars.
ObjectQuery<Product> productQuery =
context.Products
.Where("it.StandardCost > @cost", new ObjectParameter("cost", cost));
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 dollars.
Dim cost = 10
Dim productQuery As ObjectQuery(Of Product) = context.Products.Where("it.StandardCost > @cost")
productQuery.Parameters.Add(New ObjectParameter("cost", cost))
' 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")
int cost = 10;
// Return Product objects with a standard cost
// above 10 dollars.
ObjectQuery<Product> productQuery =
context.Products
.Where("it.StandardCost > @cost", new ObjectParameter("cost", cost));
// 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.Contacts.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.Contacts
.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 eines konzeptionellen Modells (Entity Framework)
Laden von verknüpften Objekten (Entity Framework)