"O" equivalente en Linq Where () expresión lambda

91

¿Existe un método en Linq donde pueda usar para construir cadenas SQL como "... donde (a = 1) OR (a = 2)"?

dstr
fuente
4
Supongo que sabes cómo usarlo ||y quieres algo dinámico, como a=a.where(hour=> hour<20); if(weekend) a=a.where(hour=> hour>6);. Es posible que desee decirlo más claramente ...
Kobi

Respuestas:

189

Ciertamente puede hacerlo dentro de una cláusula Where (método de extensión). Sin embargo, si necesita crear una consulta compleja de forma dinámica, puede utilizar un PredicateBuilder .

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

O usando 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 );
tvanfosson
fuente
Esto funcionó muy bien ya que necesitaba construir mi O dependiendo de los valores de los parámetros entrantes - ¡Impresionante!
Mark
Muy genial. Es una pena que esto no esté incluido como una función dentro de .NET como estándar.
maxp
1
Muy buena implementación, aunque es posible que no se haya notado, esto solo funciona para C # 5+.
Thomas.Donnelly
25

Puede usar los operadores booleanos estándar de .NET en su cláusula where única:

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

Usas los mismos operadores que en C # ===> || para "o" && para "y", etc.

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

en su .Where()llamada se debe usar el estándar de Boole 'O' operador, ||.

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

Todo lo que hace la llamada Where es una comparación booleana de cualquier cosa que desee, por lo que puede completarla con tanta lógica condicional como desee.

Alastair Pitts
fuente
0

Si no conoce el recuento de parámetros, puede usar esto:

Data de muestra

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 Aydin
fuente
-1

Esto está integrado en .net ahora, no estoy seguro si antes no lo estaba. Dada una consulta Linq existente, puede agregar una cláusula where que tome una matriz de cadenas (SearchStrings) y verificar si alguna de ellas coincide con el objeto de la colección que está buscando. El uso de ToLower () solo se asegura de evitar la distinción entre mayúsculas y minúsculas en las consultas SQL.

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

Puede hacer lo mismo para un predicado "y" haciendo coincidir todas las palabras de la matriz con el objeto de la colección.

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

En este ejemplo, i se correlaciona con cada objeto de una colección y s se correlaciona con cada cadena de la matriz SearchStrings.

JMacor
fuente
1
Tenga en cuenta que un proveedor de EF no puede traducir 'Any' y se evaluará localmente, lo que dará como resultado un escaneo completo de la tabla y un filtrado en memoria.
Wade Bee