2010-01-20 3 views
73

Есть ли метод в Linq, где вы можете использовать для построения строк SQL, таких как «... где (a = 1) ИЛИ (a = 2)»?«Или» эквивалент в Linq Где() выражение lambda

+3

Я предполагаю, что вы знаете, как использовать '||' и хотите что-то динамическое, например 'a = a.where (hour => hour <20); если (в выходные) a = a.where (час => час> 6); '. Вы можете заявить, что более четко ... – Kobi

ответ

154

Вы, конечно, можете это сделать в ИНЕКЕ (метод расширения). Если вам нужно построить сложный запрос динамически, вы можете использовать PredicateBuilder.

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

Или используя 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

Приятное использование предикатов! +1 :) –

+0

Это отлично поработало, так как мне нужно было построить мой или зависящий от значений входящих параметров - Awesome! – dadwithkids

+0

Очень круто. Это позор, который не включен как функция внутри .NET в качестве стандарта. – maxp

20

Вы можете использовать стандартные .NET логические операторы в ваш единственный пункт, где:

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

Я думаю, что это лучший и самый простой ответ. – user1477388

+1

Это самый простой ответ. – Eranda

16

Вы использовать все равно операторы, как в обычном C# ===> || за «или» & & за «и» и т.д.

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

Я предпочитаю этот метод, он выглядит более естественно – nXqd

1

в вашем .Where() вызова использовать стандартный Boolean 'или' оператора, ||.

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

Все где вызов делает логическое сравнение на все, что вы хотите, так что вы можете заполнить его столько условной логики, как вы хотите.

0

Это встроено в .net сейчас, не уверен, что раньше это не было. Учитывая существующий запрос Linq, вы можете добавить предложение where, которое принимает массив строк (SearchStrings), и проверить, соответствует ли любой из них любому объекту в коллекции, которую вы ищете. Использование ToLower() просто гарантирует, что вы избегаете чувствительности к регистру в SQL-запросах.

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

Вы можете сделать то же самое для в «и» предикат, сопоставляя все слова в массиве на объект коллекции.

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

В этом примере я коррелирует с каждым объектом в коллекции, а также с коррелирует с каждой строкой в ​​массиве SearchStrings.

Смежные вопросы