Dynamique de la clause where dans LINQ - avec les noms de colonnes disponibles au moment de l'exécution
Avertissement: j'ai résolu le problème en utilisant des Expressions à partir du Système.Linq.Expressions, mais je suis toujours à la recherche d'un mieux/plus facile.
Considérons la situation suivante :
var query =
from c in db.Customers
where (c.ContactFirstName.Contains("BlackListed") ||
c.ContactLastName.Contains("BlackListed") ||
c.Address.Contains("BlackListed"))
select c;
Les colonnes/attributs qui doivent être vérifiés par rapport à la liste noire terme ne sont disponibles que pour moi au moment de l'exécution. Comment puis-je générer cette dynamique clause where?
Une complication supplémentaire est que le Queryable collection (db.Les clients ci-dessus) est tapé un Queryable de la classe de base de "Client" (dire "Personne"), et donc de l'écriture c.Adresse que ci-dessus n'est pas une option.
Je serais curieux de voir vos Expressions solution, aucune chance de les ajouter à votre réponse? Des acclamations.
Voir ce question et mon ultérieure réponse concernant la dynamique des requêtes LINQ
Voir ce question et mon ultérieure réponse concernant la dynamique des requêtes LINQ
OriginalL'auteur sandesh247 | 2008-10-24
Vous devez vous connecter pour publier un commentaire.
@Geoff a la meilleure option, justing Dynamique LINQ.
Si vous voulez aller dans le sens de la création de requêtes à la volée en utilisant Lambda si j'avais recommande que vous utilisez le PredicateBuilder (http://www.albahari.com/nutshell/predicatebuilder.aspx) et avoir quelque chose comme ceci:
Et ainsi de suite pour toutes les colonnes que vous souhaitez inclure. Lorsque vous arrivez à votre requête, vous avez juste besoin quelque chose comme ceci:
J'ai utilisé ça pour faire la construction de LINQ pour la recherche où il y a environ 20 différentes options et il donne vraiment bonne SQL.
OriginalL'auteur Aaron Powell
Remarque qu'ils ne sont pas mutuellement exclusives.
OriginalL'auteur James Curran
Vous pouvez transformer votre où l'une des clauses sur et en dehors à l'aide de certaines expressions logiques.
Si ignoreFirstName est vrai dans la requête, alors la condition de l'autre côté de l'instruction ou seront ignorés.
OriginalL'auteur timothy
Puisque ce n'est pas LINQ to Objects, mais plutôt de LINQ to SQL, vous n'avez pas d'autre alternative à côté de l'aide soit d'Expressions ou d'une procédure stockée.
OriginalL'auteur Omer van Kloeten