69 votes

LINQ - clause WHERE dynamique?

Quel est le meilleur moyen d'assembler une clause WHERE dynamique à une instruction LINQ?

J'ai plusieurs douzaines de cases à cocher sur un formulaire et je les renvoie sous la forme suivante: Dictionnaire <chaîne, Liste <chaîne >> (Dictionnaire <nom_zone, Liste <valeurs >>) à ma requête LINQ.

 public IOrderedQueryable<ProductDetail> GetProductList(string productGroupName, string productTypeName, Dictionary<string,List<string>> filterDictionary)
{
    var q = from c in db.ProductDetail
            where c.ProductGroupName == productGroupName && c.ProductTypeName == productTypeName
            // insert dynamic filter here
            orderby c.ProductTypeName
            select c;
    return q;
}
 

54voto

Thomas Stock Points 4165

texte alternatif

Vous avez besoin de quelque chose comme ça? Utilisez la bibliothèque de requêtes dynamiques Linq (le téléchargement inclut des exemples).

Consultez le blog de ScottGu pour plus d'exemples.

14voto

Linus Points 676

Vous pouvez également utiliser PredicateBuilder de LinqKit pour chaîner plusieurs expressions lambda typesafe à l’aide de Or ou And.

http://www.albahari.com/nutshell/predicatebuilder.aspx

10voto

Nitin Bourai Points 92

Une approche simple peut être si vos colonnes sont de type simple comme String

 public static IEnumerable<MyObject> WhereQuery(IEnumerable<MyObject> source, string columnName, string propertyValue)
         {
             return source.Where(m => { return m.GetType().GetProperty(columnName).GetValue(m, null).ToString().StartsWith(propertyValue); });

 }
 

2voto

TcKs Points 13249

J'avais la même question ( http://stackoverflow.com/questions/798553/user-defined-filter-for-linq ) et @tvanfosson m'a parlé de Dynamic Linq ( http://code.msdn.microsoft.com/csharpsamples ).

1voto

mynameistodd Points 61

Vous pouvez utiliser la méthode d'extension Any (). Ce qui suit semble fonctionner pour moi.

 XStreamingElement root = new XStreamingElement("Results",
                from el in StreamProductItem(file)
                where fieldsToSearch.Any(s => el.Element(s) != null && el.Element(s).Value.Contains(searchTerm))
                select fieldsToReturn.Select(r => (r == "product") ? el : el.Element(r))
            );
            Console.WriteLine(root.ToString());
 

Où 'fieldToSearch' et 'fieldsToReturn' sont les deux objets de la liste.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X