Existe um método no Linq onde você pode usar para construir strings SQL como "... where (a = 1) OR (a = 2)"?
Respostas:
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 );
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')
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.
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();
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.
||
e queira algo dinâmico, comoa=a.where(hour=> hour<20); if(weekend) a=a.where(hour=> hour>6);
. Você pode querer afirmar isso de forma mais clara ...