Nous travaillons sur une visionneuse de journaux. L'utilisation aura la possibilité de filtrer par utilisateur, gravité, etc. Dans les jours Sql j'ajouterais à la chaîne de requête, mais je veux le faire avec Linq. Comment puis-je ajouter conditionnellement des clauses where?
c#
linq
linq-to-sql
.net-3.5
sgwill
la source
la source
LINQ to Entities does not recognize the method 'System.String get_Item(System.String)' method, and this method cannot be translated into a store expression.
Si vous avez besoin de filtrer la base sur une liste / un tableau, utilisez ce qui suit:
la source
J'ai fini par utiliser une réponse similaire à celle de Daren, mais avec une interface IQueryable:
Cela construit la requête avant d'accéder à la base de données. La commande ne s'exécutera pas avant .ToList () à la fin.
la source
En ce qui concerne le linq conditionnel, j'aime beaucoup le motif des filtres et des tuyaux.
http://blog.wekeroad.com/mvc-storefront/mvcstore-part-3/
Fondamentalement, vous créez une méthode d'extension pour chaque cas de filtre qui prend dans IQueryable et un paramètre.
la source
J'ai résolu cela avec une méthode d'extension pour permettre à LINQ d'être activé conditionnellement au milieu d'une expression fluide. Cela supprime le besoin de fractionner l'expression avec des
if
instructions..If()
méthode d'extension:Cela vous permet de faire ceci:
Voici également une
IEnumerable<T>
version qui gérera la plupart des autres expressions LINQ:la source
Une autre option serait d'utiliser quelque chose comme le PredicateBuilder discuté ici . Il vous permet d'écrire du code comme celui-ci:
Notez que cela ne fonctionne qu'avec Linq 2 SQL. EntityFramework n'implémente pas Expression.Invoke, qui est nécessaire pour que cette méthode fonctionne. J'ai une question à ce sujet ici .
la source
Ce faisant:
avoir ceci dans la
where
déclaration:signifie que lorsque la requête finale est créée, si
lastNameSearch
estfalse
la requête SQL omettre complètement toute la dernière recherche de nom.la source
Ce n'est pas la plus jolie chose mais vous pouvez utiliser une expression lambda et passer vos conditions facultativement. Dans TSQL, je fais beaucoup de choses suivantes pour rendre les paramètres facultatifs:
Vous pouvez dupliquer le même style avec un lambda suivant (un exemple de vérification de l'authentification):
la source
J'ai eu une exigence similaire récemment et j'ai finalement trouvé cela dans le MSDN. Exemples CSharp pour Visual Studio 2008
Les classes incluses dans l'exemple DynamicQuery du téléchargement vous permettent de créer des requêtes dynamiques au moment de l'exécution au format suivant:
En utilisant cela, vous pouvez créer une chaîne de requête de manière dynamique au moment de l'exécution et la transmettre à la méthode Where ():
la source
Vous pouvez créer et utiliser cette méthode d'extension
la source
Utilisez simplement l'opérateur && de C #:
Edit: Ah, besoin de lire plus attentivement. Vous vouliez savoir comment ajouter conditionnellement des clauses supplémentaires. Dans ce cas, je n'en ai aucune idée. :) Ce que je ferais probablement, c'est simplement préparer plusieurs requêtes et exécuter la bonne, en fonction de ce dont j'ai fini par avoir besoin.
la source
Vous pouvez utiliser une méthode externe:
Cela fonctionnerait, mais ne peut pas être décomposé en arborescences d'expressions, ce qui signifie que Linq to SQL exécuterait le code de vérification sur chaque enregistrement.
Alternativement:
Cela pourrait fonctionner dans les arbres d'expression, ce qui signifie que Linq to SQL serait optimisé.
la source
Eh bien, je pensais que vous pouviez mettre les conditions de filtre dans une liste générique de prédicats:
Il en résulte une liste contenant "moi", "meyou" et "tondre".
Vous pouvez optimiser cela en faisant le foreach avec les prédicats dans une fonction totalement différente qui ORs tous les prédicats.
la source