Existe-t-il un modèle utilisant Linq pour créer dynamiquement un filtre ?
-
09-06-2019 - |
Question
Existe-t-il un modèle utilisant Linq pour créer dynamiquement un filtre ?
J'ai besoin de créer un filtrage personnalisé sur une liste, dans le passé, je créais simplement dynamiquement le SQL... il ne semble pas que cela soit possible avec Linq.
La solution
Vérifiez Bibliothèque Linq dynamique du blog de ScottGu :
Par exemple, vous trouverez ci-dessous une requête LINQ to SQL VB standard de type sécurisé qui récupère les données d'une base de données Northwind et les affiche dans un contrôle ASP.NET GridView :
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()
En utilisant la bibliothèque LINQ DynamicQuery, je pourrais réécrire l'expression de requête ci-dessus comme suit
Dim Northwind As New NorthwindDataContext
Dim query = Northwind.Products .where("CategoryID=2 And UnitPrice>3") . OrderBy("SupplierId")
Gridview1.DataSource = query
GridView1.DataBind()
Remarquez comment les clauses conditionnelle-where et sort-orderby prennent désormais des expressions de chaîne au lieu d'expressions de code.Parce qu'il s'agit de chaînes à liaison tardive, je peux les construire dynamiquement.Par exemple:Je pourrais fournir une interface utilisateur à un analyste commercial utilisateur final à l'aide de mon application, ce qui lui permettrait de construire lui-même des requêtes (y compris des clauses conditionnelles arbitraires).
Autres conseils
Dynamic Linq est une voie à suivre.
Cela peut être excessif pour votre scénario.Considérer:
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();
quelque chose comme ça?
var myList = new List<string> { "a","b","c" };
var items = from item in db.Items
where myList.Contains(item.Name)
select item;
cela créerait une instruction SQL comme
SELECT * FROM Items [t0] where Name IN ('a','b','c')