Conditionnel Requêtes Linq
Nous travaillons sur un afficheur de Journal. L'utilisation aurez la possibilité de filtrer par utilisateur, la gravité, etc. Dans le Sql jours, je voudrais ajouter à la chaîne de requête, mais je veux le faire avec Linq. Comment puis-je conditionnellement ajouter où-clauses?
Vous devez vous connecter pour publier un commentaire.
si vous voulez seulement de filtre si certains critères est passé, faire quelque chose comme ceci
Le faire de cette manière permettra à votre arborescence d'Expression à être exactement ce que vous voulez. De cette façon, le SQL de création sera exactement ce dont vous avez besoin et rien de moins.
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.
var query = from x in context.Logs where x.User == myArray[0] select log;
utilisation:var u = myArray[0]; var query = from x in context.Logs where x.User == u select log;
Si vous avez besoin de filtrer base sur une Liste ou un Tableau, utilisez les éléments suivants:
J'ai fini à l'aide d'une réponse similaire à Daren, mais avec un IQueryable interface:
Qui fabrique de la requête avant de frapper la base de données. La commande ne fonctionnera pas jusqu'à ce que .ToList() à la fin.
Quand il s'agit du conditionnel linq, je suis très friand des filtres et tuyaux de modèle.
http://blog.wekeroad.com/mvc-storefront/mvcstore-part-3/
Fondamentalement, vous créez une méthode d'extension pour chaque filtre qui prend dans le IQueryable et d'un paramètre.
Une autre option serait d'utiliser quelque chose comme le PredicateBuilder discuté ici.
Il vous permet d'écrire du code comme le suivant:
Noter que je n'ai que cela fonctionne avec Linq 2 SQL. EntityFramework ne pas mettre en œuvre l'Expression.Invoquer, ce qui est nécessaire pour que cette méthode fonctionne. J'ai une question concernant cette question ici.
Faire:
ayant ceci à l'
where
déclaration:signifie que, lors de la dernière requête est créée, si
lastNameSearch
estfalse
la requête sera complètement omettre SQL pour la dernière recherche de nom.J'ai résolu ce problème avec une méthode d'extension pour permettre à LINQ to conditionnellement être activé au moyen d'un fluide expression. Cela supprime la nécessité de briser l'expression avec
if
consolidés..If()
méthode d'extension:Cela vous permet de le faire:
Voici aussi un
IEnumerable<T>
version qui va gérer la plupart des autres expressions LINQ:Ce n'est pas la plus belle chose, mais vous pouvez utiliser une lambda expression et de transmettre vos conditions éventuellement. En TSQL je fais beaucoup de ce qui suit pour que les paramètres optionnels:
Vous ne pourrait reproduire le même style avec un suivantes lambda (un exemple de vérification d'authentification):
J'ai eu une demande similaire récemment et a finalement trouvé ce dans il MSDN.
CSharp Échantillons pour Visual Studio 2008
Les classes incluses dans le DynamicQuery échantillon de téléchargement vous permettent de créer des requêtes dynamiques à l'exécution dans le format suivant:
En utilisant cela, vous pouvez construire une chaîne de requête dynamiquement à l'exécution et la passer dans la méthode where ():
Vous pouvez créer et utiliser cette méthode d'extension
Suffit d'utiliser C#'s && opérateur:
Edit: Ah, faut lire plus attentivement. Vous voulais savoir comment conditionnellement ajouter des clauses supplémentaires. Dans ce cas, je n'ai aucune idée. 🙂 Ce que je serais probablement faire est de préparer plusieurs requêtes, et d'exécuter le droit, en fonction de ce que j'ai fini par en avoir besoin.
Vous pouvez utiliser une méthode externe:
Ce serait le travail, mais ne peut pas être décomposé en arbres d'expression, ce qui signifie que Linq to SQL, exécutez le code de vérification à l'encontre de chaque enregistrement.
Sinon:
Qui pourraient travailler dans les arborescences d'expression, sens Linq to SQL serait optimisée.
Bien, ce que je pensais, vous pouvez mettre les conditions de filtre dans une liste générique de Prédicats:
Que les résultats dans une liste contenant "moi", "meyou", et de "tondre".
Vous pouvez optimiser en faisant le foreach avec les prédicats dans une toute autre fonction que les Rup tous les prédicats.