2010-01-20 4 views
73

Y at-il une méthode dans Linq où vous pouvez utiliser pour construire des chaînes SQL comme "... où (a = 1) OU (a = 2)"?"Ou" équivalent dans Linq Où() expression lambda

+3

Je suppose que vous savez comment utiliser '||' et que vous voulez quelque chose de dynamique, comme 'a = a.where (hour => hour <20); si (week-end) a = a.where (heure => heure> 6); Vous voudrez peut-être le dire plus clairement ... – Kobi

Répondre

154

Vous pouvez certainement le faire dans une clause Where (méthode d'extension). Si vous devez créer une requête complexe dynamiquement, vous pouvez utiliser un PredicateBuilder.

var query = collection.Where(c => c.A == 1 || c.B == 2); 

ou en utilisant un PredicateBuilder

var predicate = PredicateBuilder.False<Foo>(); 
predicate = predicate.Or(f => f.A == 1); 
if (allowB) 
{ 
    predicate = predicate.Or(f => f.B == 1); 
} 

var query = collection.Where(predicate); 
+0

Joli usage des prédicats! +1 :) –

+0

Cela a fonctionné très bien car je devais construire mon Ou en fonction des valeurs des paramètres entrants - Awesome! – dadwithkids

+0

Très cool. C'est une honte que ce n'est pas inclus en tant que fonction à l'intérieur de. NET en standard. – maxp

20

Vous pouvez utiliser les opérateurs booléens .NET standard dans votre seule clause where:

MyDataSource.Where(data => data.a == 'a' || data.a == 'b') 
+4

Je pense que c'est la réponse la meilleure et la plus simple. – user1477388

+1

C'est la réponse la plus simple. – Eranda

16

Vous pouvez utiliser tous les mêmes opérateurs comme en C# ===> || pour "ou" & & pour "et" etc.

var something = from s in mycollection 
       where s.something == 32 || 
         s.somethingelse == 45 
       select s 
+1

Je préfère cette méthode, elle semble plus naturelle – nXqd

1

dans votre .Where() appel utilisent la norme booléenne ou d'opérateur, ||.

var query = items.Where(item => (item == 1 || item == 2)); 

Tous les cas où l'appel est fait une comparaison booléenne sur tout ce que vous voulez, vous pouvez le remplir avec autant de logique conditionnelle que vous le souhaitez.

0

Ceci est intégré dans .net maintenant, pas sûr si elle ne l'était pas auparavant. Étant donné une requête Linq existante, vous pouvez ajouter une clause where qui prend un tableau de chaînes (SearchStrings) et vérifier si l'une d'elles correspond à l'objet de la collection que vous recherchez. L'utilisation de ToLower() s'assure que vous évitez la casse dans les requêtes SQL.

query.Where(i => SearchStrings.Any(s => i.ToLower().Contains(s.ToLower())); 

Vous pouvez faire la même chose pour un « et » prédicat en faisant correspondre tous les mots dans le tableau à l'objet de la collection.

query.Where(i => SearchStrings.All(s => i.ToLower().Contains(s.ToLower())); 

Dans cet exemple, est en corrélation avec chaque objet dans une collection, et s est en corrélation avec chaque chaîne dans le tableau searchstrings.

Questions connexes