Gibt es ein Muster, das Linq verwendet, um dynamisch einen Filter zu erstellen?
-
09-06-2019 - |
Frage
Gibt es ein Muster, das Linq verwendet, um dynamisch einen Filter zu erstellen?
Ich muss eine benutzerdefinierte Filterung für eine Liste erstellen. Früher habe ich SQL einfach dynamisch erstellt. Mit Linq scheint dies nicht möglich zu sein.
Lösung
Besuche die Dynamische Linq-Bibliothek aus ScottGus Blog:
Im Folgenden finden Sie beispielsweise eine standardmäßige typsichere LINQ to SQL VB-Abfrage, die Daten aus einer Northwind-Datenbank abruft und sie in einem ASP.NET GridView-Steuerelement anzeigt:
Dim Northwind As New NorthwindDataContext
Dim query = From q In Northwind.Products Where p.CategoryID = 2 And p.UnitPrice > 3 Order By p.SupplierID Select p
Gridview1.DataSource = query
GridView1.DataBind()
Mit der LINQ DynamicQuery-Bibliothek könnte ich stattdessen den obigen Abfrageausdruck so umschreiben
Dim Northwind As New NorthwindDataContext
Dim query = Northwind.Products .where("CategoryID=2 And UnitPrice>3") . OrderBy("SupplierId")
Gridview1.DataSource = query
GridView1.DataBind()
Beachten Sie, dass die Conditional-Where-Klausel und die Sort-Orderby-Klausel jetzt String-Ausdrücke anstelle von Code-Ausdrücken akzeptieren.Da es sich um spät gebundene Zeichenfolgen handelt, kann ich sie dynamisch erstellen.Zum Beispiel:Ich könnte einem Endbenutzer-Geschäftsanalysten mithilfe meiner Anwendung eine Benutzeroberfläche zur Verfügung stellen, die es ihm ermöglicht, selbst Abfragen zu erstellen (einschließlich beliebiger Bedingungsklauseln).
Andere Tipps
Dynamic Linq ist ein Weg.
Es könnte für Ihr Szenario übertrieben sein.Halten:
IQueryable<Customer> query = db.Customers;
if (searchingByName)
{
query = query.Where(c => c.Name.StartsWith(someletters));
}
if (searchingById)
{
query = query.Where(c => c.Id == Id);
}
if (searchingByDonuts)
{
query = query.Where(c => c.Donuts.Any(d => !d.IsEaten));
}
query = query.OrderBy(c => c.Name);
List<Customer> = query.Take(10).ToList();
etwas wie das?
var myList = new List<string> { "a","b","c" };
var items = from item in db.Items
where myList.Contains(item.Name)
select item;
das würde eine SQL-Anweisung wie erstellen
SELECT * FROM Items [t0] where Name IN ('a','b','c')