38.4 Abfrage-Generator-Methoden (QueryBuilder-Methoden)
In einem großen Teil dieses Kapitels haben wir uns den Abfragen mit LINQ to Entities und Entity SQL gewidmet. Sie können aber eine Mischung aus beiden Abfragetechniken verwenden, die Methoden der Klasse ObjectQuery verwenden. Diese Methoden verwenden Entity-SQL-Fragmente und ersetzen mit diesen die Lambda-Ausdrücke.
Sehen wir uns dazu sofort ein Beispiel an, das uns alle Artikel zurückgibt, die einen bestimmten Preis übersteigen:
var query = context.Products
.Where("it.UnitPrice >= 50");
Es fällt bei dieser Abfrage auf, dass der Methode Where kein Lambda-Ausdruck übergeben wird, sondern stattdessen eine Zeichenfolge, die an Entity SQL erinnert. Where ist hier die sogenannte QueryBuilder-Methode, die zu der Klasse ObjectQuery gehört. Um es ganz deutlich zu sagen: Es handelt sich dabei nicht um eine Erweiterungsmethode.
Ungewöhnlich ist die Verwendung des Präfixes it. Dabei handelt es sich um eine implizite Festlegung der Referenz auf das ObjectQuery-Objekt.
In der Klasse ObjectQuery sind einige QueryBuilder-Methoden definiert: Where, Select, GroupBy, OrderBy, Skip – um nur einige zu nennen. Allerdings wird auch nicht jede LINQ-Erweiterungsmethode durch eine QueryBuilder-Methode ersetzt. Sollten Sie sich für alle QueryBuilder-Methoden interessieren, informieren Sie sich bitte in der Dokumentation der Klasse ObjectQuery.
Lambda-Ausdrücke übergeben Parameter an eine Methode. Mit den QueryBuilder-Methoden werden die Parameter nun durch Zeichenfolgen auf Basis von Entity SQL beschrieben. Das ist der wesentliche Unterschied zwischen den QueryBuilder-Methoden und LINQ to Entities.
Ein etwas aufwendigeres Beispiel beschreibt Listing 38.27. Es werden zuerst Daten abgefragt, die als Parameter der Abfrage dienen. Damit wird die Methode Where ausgeführt.
using(NorthwindEntities context= new NorthwindEntities())
{
Console.Write("Preise ab: ");
decimal price = Convert.ToDecimal(Console.ReadLine());
Console.Write("Kategorie-ID: ");
int catID = Convert.ToInt32(Console.ReadLine());
var query = context.Products
.Where("it.Unitprice > @price AND it.CategoryID==@cat",
new ObjectParameter("price", price),
new ObjectParameter("cat", catID))
.Select("it.ProductName, it.UnitPrice");
foreach (var item in query)
Console.WriteLine("{0,-35}{1}", item.GetValue(0), item.GetValue(1));
}
Listing 38.27 QueryBuilder-Methoden
Sie können der Where-Methode beliebig viele Parameter übergeben. Jeder Parameter muss aber durch ein ObjectParameter-Objekt genau definiert werden. Die entsprechenden Referenzen werden an den zweiten Parameter der Where-Methode übergeben, bei dem es sich um einen params-Parameter handelt. Das Bemerkenswerte ist dabei die Tatsache, dass die Typen der Parameter korrekt sein müssen.
Listing 38.27 enthält mit Select noch eine weitere QueryBuilder-Methode, mit der in unserem Beispiel die Eigenschaften ProductName und UnitPrice in die Ergebnismenge projiziert werden.
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.