8
votes

Comment construire linq de manière dynamique

J'ai un scénario où j'ai des noms de colonne configurés personnalisés, des opérateurs associés comme <> = entre etc., puis une valeur associée.

J'essaie de déterminer s'il est possible d'accumuler une requête LINQ avec une dynamique (chaîne) où la clause?

J'ai remarqué le prédicat.or préditcate. Et ça ne fait pas tout ce dont je parle.

Toute suggestion?


2 commentaires

Dupliquer possible de ce Stackoverflow.com/Questtions/736952/... question


"Cependant, Dynamic Linq ne fonctionne que sur iquérissable et non iénumérable" - voir la note à propos de la réponse de ma réponse ...


3 Réponses :


8
votes

En réalité, il existe une bibliothèque spécifique de Microsoft ( System.LINQ.DYNAMIC ) fourni avec les échantillons C # VS2008 qui le soutiennent. Obtenez-le de ici (téléchargement Microsoft)

La bibliothèque est incluse dans le répertoire \ linqsamples \ dynamicquery des échantillons de téléchargement ci-dessus.

Pour de nombreux exemples d'utilisation Vérifiez cette page: http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamique-linq-part--utilisation-Le-linq-dynamic- Query-bibliothèque.aspx


2 commentaires

Ok, system.linq.dynamic semble exactement ce que je recherche à première vue. Cependant, la linq dynamique ne fonctionne que sur iquérissable et non iEnumérable. Donc, cela laisse encore un peu un problème.


@Jabezzz Ce n'est pas un problème, il ne devrait pas fonctionner que sur iquéryable en raison de la conception et de l'intention de iquérirable . (Lire Cet article pour mieux comprendre comment Iquéririsable renvoie des données à la demande.) Il existe une méthode d'extension ienumer



9
votes

Si vous parlez d'un string clause (plutôt que de construire l'expression, etc., vous-même, alors le Bibliothèque Dynamic Linq ( Dans les 3,5 échantillons, IIRC) devrait suffire.

Notez que l'exemple ci-dessous est destiné à l'utilisation de la base de données; Mais vous pouvez l'utiliser avec des objets linq-to-objets en appelant .asquerisery () sur vos données en mémoire.

 text alt


1 commentaires

Bien que Alex ait été d'abord avec la bibliothèque Dynamic Linq, la partie qui manquait a été soulevée par Marc (désolé d'avoir manqué cela). Vous avez besoin de la méthode d'extension .asQuery () pour pouvoir travailler avec vos collections.



2
votes

1 commentaires

C'est une manière plus sûre que d'utiliser Dynamiclinq, qui semble très injection-vulnérable.