2010-09-10 23 views

risposta

33

Sì è possibile, come:

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

Perché Where sta producendo un IQueryable, l'esecuzione è rimandata alla ToList nel mio esempio in modo da poter catena Where s insieme tanto quanto si desidera e poi basta eseguirlo dopo aver superato tutte le tue condizioni.

+2

+1 Miglior risposta dei tre. –

+0

Dove non produce IQueryable, produce IEnumerable. Risposta errata –

+0

@OmerK Dove il prodotto In-fact IQueryable, se l'oggetto su cui si sta eseguendo il metodo di estensione è anche IQueryable, se lo si esegue su un oggetto IEnumerable, si otterrà un oggetto IEnumerable. –

5

Fare uso di WhereIf metodo extenstion avaialbe in linq

Esempio

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

anziché sopra andare per il seguito

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

LINQ WhereIf Extension Method

LINQ to SQL Where Clause Optional Criteria

+1

Uno dei collegamenti è morto e non esiste una cosa come "WhereIf" nel mio EF. – A1rPun

0

io non sono sicuro di quello che la domanda è, ma una possibile risposta potrebbe essere:

Sì,

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

Sarebbe un modo complicato per dire qualcosa di semplice, però.

+0

come sarà possibile aver provato? –

+1

Sì, almeno funziona con linq-to-objects. –

+0

Che è uguale a: list.Where (item => Foo (item)); –

4

Non so se questo è appropriato, ma è molto utile, è possibile utilizzare IFS abbastanza comodamente con condizionale WHERE:

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); 

Quindi la clausola in cui sarà modificato in base a ciò che è in UUF1 o UUF2 vale a dire potresti avere solo UUF1 con informazioni, nel qual caso ci vorrà e ignorare la clausola UUF2 where potresti avere entrambe le opzioni in cui prenderà entrambe o potresti non avere nulla in UUF1 o 2 e la tua clausola where prenderà semplicemente la accountid come clausola where.

2

Avevo uno scenario come questo in cui dovevo controllare null all'interno della lista stessa. Questo è quello che ho fatto.

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 

Ma, come Kelsey ha sottolineato questo dovrebbe funzionare anche -

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

così, se 'someCondition' è falsa, 'Dove' verrà ignorato.

+0

Questa dovrebbe essere la risposta accettata –

1

Nel mio caso c'erano due "con riserva", dove a seconda chiavi di ricerca, così ho fatto:

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