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.

War es hilfreich?

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')
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top