10
votes

Collection de filtrage avec LINQ

disons que nous avons une collection d'objets de personne xxx

et quelque part dans la collection définie par code xxx

Nous devons avoir un Filtre nécessitant filtrer la collection et renvoyer le résultat à l'utilisateur final. Disons que nous avons une collection d'objets de type filtre xxx

et quelque part dans le code, nous avons xxx

donc nous avons besoin Pour filtrer le contenu de la collection de la liste des personnes par des filtres définis dans la collection UserFilters. Où la filtre.fieldname == "personneName" || Filtre.fieldName == "personaddress" . Comment puis-je faire cela avec Linq de manière cool? Les solutions telles que le commutateur / l'affaire, ou Peut-être que je pensais que la méthode de vulgarisation sur la liste des personnes détermine du fichier filedName la propriété de la personne à examiner, est connue. Autre chose ? Quelque chose de difficile :) Merci.


2 commentaires

Est-ce que cela utilise en mémoire LINQ ou LINQTOSQL?


Ceci est en mémoire LINQ. J'ai besoin d'interroger un ensemble d'objets définis dans la collecte avec des filtres définis dans une autre collection. Il n'y a pas d'interaction de DB.


4 Réponses :


3
votes

Vous pouvez le faire par réflexion: xxx

(non compilé, mais cela doit être le long de la bonne voie)


3 commentaires

Frais! Honnêtement, je ne sais pas, si je vais appliquer cette technique sur mon code réel, c'est très gentil. J'aime des choses génériques, même si ce n'est pas si bon pour des raisons de performance. Malheureusement, je ne suis pas capable de voter pour votre réponse (ma réputation est de moins de 15 ans), mais la réponse est définitive.


Notez que cela ne fonctionnera pas sur la plupart des backends Linq; Je doute beaucoup sur SQL pourra traduire des appels de réflexion en SQL.


Oui je suis d'accord. Au fait, dans mon cas, je n'ai besoin d'aucune interaction DB.



10
votes

Vous pouvez créer une expression Lambda pour créer un prédicat approprié à l'aide de la classe code> Expression CODE>.

public static IEnumerable<T> Where<T>(this IEnumerable<T> source, 
                                           IEnumerable<Filter> filters)
{
    return Enumerable.Where(source, CreateFilterExpression<T>(filters).Compile());
}


0 commentaires

0
votes

J'ajouterais une méthode à la classe Code> Filtre Code> Pour vérifier si le filtre est satisfait:

var filtered_list = personsList.Where(p => userFilters.Any(f => f.IsSatisfied(p)));


0 commentaires

2
votes

Vous ne pouvez pas simplement faire

personList.Where(x => x.PersonName == "YourNameHere").ToList() ?


1 commentaires

Le filtre est composé de propriétés de nom de terrain, donc je ne sais pas si l'utilisateur souhaite filtrer contre la personneName ou PersonAddress, ou peut être d'autres propriétés possibles de la classe de personnes.