2010-01-20 15 views
73

¿Hay algún método en Linq donde pueda usar para construir cadenas de SQL como "... donde (a = 1) OR (a = 2)"?"O" equivalente en Linq Donde() expresión lambda

+3

Supongo que sabes cómo usar '||' y quieres algo dinámico, como 'a = a.where (hour => hour <20); if (fin de semana) a = a.where (hora => hora> 6); '. Es posible que desee expresarlo con mayor claridad ... – Kobi

Respuesta

154

Por supuesto que puede hacerlo dentro de una cláusula Where (método de extensión). Sin embargo, si necesita construir una consulta compleja de forma dinámica, puede usar un PredicateBuilder.

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

o utilizando 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

¡Buen uso de los predicados! +1 :) –

+0

Esto funcionó muy bien ya que necesitaba construir mi O dependiendo de los valores de los parámetros entrantes - ¡Increíble! – dadwithkids

+0

Muy bueno. Es una pena que esto no esté incluido como una función dentro de .NET como estándar. – maxp

20

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

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

Creo que esta es la mejor y más simple respuesta. – user1477388

+1

Esta es la respuesta más simple. – Eranda

16

se utiliza el de todos modos operadores como en C normal ===> || a favor "o" & & de "y", etc.

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

Prefiero este método, parece más natural – nXqd

1

en su llamada .Where() utilizar el 'O' operador booleano estándar, ||.

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

Toda la llamada Donde hace es una comparación de Boole en cualquier cosa que desee, para que pueda llenarlo con lógica condicional tanto como desee.

0

Esto está integrado en .net ahora, no estoy seguro si anteriormente no lo era. 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 asegura que se evite la distinción entre mayúsculas y minúsculas en las consultas SQL.

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

Usted puede hacer lo mismo para un 'y' predicado, haciendo coincidir todas las palabras en la matriz de objetos de la colección.

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

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

Cuestiones relacionadas