2010-09-10 16 views

Respuesta

33

Sí se puede gustar:

var query = someList.Where(a => a == "something"); 
if (condition) 
{ 
    query = query.Where(b => b == "something else"); 
} 
var result = query.ToList(); 

Debido Where está produciendo un IQueryable, la ejecución se difiere hasta que el ToList en mi ejemplo para que pueda cadena Where S, así como todo lo que quieras y luego simplemente ejecutarlo después de haber pasado todas sus condiciones

+2

+1 Mejor respuesta de los tres. –

+0

Donde no está produciendo IQueryable, está produciendo IEnumerable. Respuesta incorrecta –

+0

@OmerK ¿Dónde se encuentra el producto IQueryable, si el objeto en el que está ejecutando el método de extensión también es un IQueryable, si lo ejecuta en un IEnumerable, obtendrá un IEnumerable. –

5

Hacer uso de WhereIf extenstion método avaialbe en linq

Ejemplo

if (SearchControlMain.PostingID.HasValue) 
    query = query.Where(q => q.PostingID == SearchControlMain.PostingID); 

en lugar de por encima de ir para el siguiente

query = query.WhereIf(SearchControlMain.CategoryID.HasValue, q => q.CategoryID == SearchControlMain.CategoryID); 

LINQ WhereIf Extension Method

LINQ to SQL Where Clause Optional Criteria

+1

Uno de los enlaces está muerto y no existe tal cosa como 'WhereIf' en mi EF. – A1rPun

0

no estoy seguro de cuál es la pregunta, pero una posible respuesta podría ser:

Sí,

list.Where(item => { if (Foo(item)) return true; else return false; }); 

Sería una manera complicada de decir algo simple, sin embargo.

+0

cómo esto será posible ¿lo has intentado? –

+1

Sí, al menos funciona con linq-to-objects. –

+0

que es igual a: list.Where (item => Foo (item)); –

4

No estoy seguro si esto es apropiado pero es bastante útil, puede utilizar IFS con bastante facilidad con condicionales donde cláusulas:

var r = (from p in productinfo.tblproduct 
        where p.Accountid == accountid 
        select p); 

      if (uuf1 != null) 
       r = r.Where(p => p.UnitUserField1 == uuf1); 

      if (uuf2!= null) 
       r = r.Where(p => p.UnitUserField2 == uuf2); 

Así que la en la que se modificó la cláusula de acuerdo a lo que está en UUF1 o UUF2 es decir, es posible que solo tengas UUF1 con información, en cuyo caso tomará eso e ignorarás la cláusula UUF2 where, es posible que tengas ambos en los que tomará ambos o podrías no tener nada en UUF1 o 2 y tu cláusula where simplemente tomará el accountid como la cláusula where.

2

Tuve un escenario como este en el que tuve que comprobar nulo dentro de la lista. Esto es lo que hice.

items = from p in items 
     where p.property1 != null //Add other if conditions 
     select p; 

// Use items the way you would use inside the if condition 

Pero como Kelsey señaló que esto funcionaría también -

items = items.Where(a => a.property1 != null); 
14
var query = someList.Where(a => (someCondition)? a == "something" : true); 

así, si 'somecondition' es falso, 'dónde' se evitará.

+0

Esto realmente debería ser la respuesta aceptada –

1

En mi caso había dos "condicional" en función de claves de búsqueda, por lo que lo hice:

var query = db.Package.Include("SomeThing") 
    .Where(item => searchString1 == null || searchString1 == "" || item.Contains(searchString1)) 
    .Where(item => searchString2 == null || searchString2 == "" || item.Contains(searchString2)); 
    ... 
Cuestiones relacionadas