"Ou" equivalente no Linq Where () expressão lambda

91

Existe um método no Linq onde você pode usar para construir strings SQL como "... where (a = 1) OR (a = 2)"?

dstr
fonte
4
Presumo que você saiba usar ||e queira algo dinâmico, como a=a.where(hour=> hour<20); if(weekend) a=a.where(hour=> hour>6);. Você pode querer afirmar isso de forma mais clara ...
Kobi

Respostas:

189

Você certamente pode fazer isso dentro de uma cláusula Where (método de extensão). Se você precisar construir uma consulta complexa dinamicamente, poderá usar um PredicateBuilder .

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

Ou usando um 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 );
Tvanfosson
fonte
Isso funcionou muito bem porque eu precisava construir meu Or dependendo dos valores dos parâmetros de entrada - Incrível!
Marcos
Muito legal. É uma pena que isso não esteja incluído como uma função dentro do .NET como padrão.
máx. De
1
Implementação muito boa, embora possa não ter sido notado, isso só funciona para C # 5+.
Thomas.Donnelly
25

Você pode usar os operadores booleanos padrão do .NET em sua única cláusula where:

MyDataSource.Where(data => data.a == 'a' || data.a == 'b')
Simon Steele
fonte
19

Você usa todos os mesmos operadores que em C # normal ===> || para "ou" && para "e" etc.

var something = from s in mycollection
                where s.something == 32 || 
                      s.somethingelse == 45 
                select s
Muad'Dib
fonte
1

em sua .Where()chamada, use o operador booleano padrão 'Or' ||,.

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

Tudo o que a chamada Where faz é uma comparação booleana em qualquer coisa que você quiser, então você pode preenchê-la com a lógica condicional que desejar.

Alastair Pitts
fonte
0

Se você não sabe a contagem de parâmetros, pode usar isto:

Dados de amostra

var parameters= new List<string>{"a","d"};
var sampledata = new Dictionary<string,string>();
    sampledata["a"] = "A";
    sampledata["b"] = "B";
    sampledata["c"] = "C";
    sampledata["d"] = "D";

Código

var query = sampledata.AsQueryable();
var firstItemKey = sampledata.FirstOrDefault().Key;
var queryresult= sampledata.Where(x => x.Key == firstItemKey).AsQueryable();
foreach (var parameter in parameters.Skip(1))
{
    queryresult=queryresult.Concat(query.Where(x => x.Key == parameter));
}
var result = queryresult.ToList();
Bora Aydın
fonte
-1

Agora ele está integrado ao .net, não tenho certeza se não estava. Dada uma consulta Linq existente, você pode adicionar uma cláusula where que pega uma matriz de strings (SearchStrings) e verificar se alguma delas corresponde a qualquer objeto na coleção que você está pesquisando. Usar ToLower () apenas garante que você evite a diferenciação de maiúsculas e minúsculas em consultas SQL.

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

Você pode fazer a mesma coisa para um predicado 'and' combinando todas as palavras na matriz com o objeto da coleção.

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

Neste exemplo, i se correlaciona com cada objeto em uma coleção es se correlaciona com cada string no array SearchStrings.

JMacor
fonte
1
Observe que 'Qualquer' não pode ser traduzido por um provedor EF e será avaliado localmente, resultando em uma verificação completa da tabela e filtragem na memória.
Wade Bee de