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.

Était-ce utile?

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')
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top