2010-09-10 4 views

Répondre

33

Oui, vous pouvez aimer:

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

Parce que Where est la production d'un IQueryable, l'exécution est différée jusqu'à ce que le ToList dans mon exemple afin que vous puissiez chaîne Where s ensemble autant que vous le souhaitez, puis exécutez juste après avoir passé toutes vos conditions.

+2

+1 Meilleure réponse sur trois. –

+0

Où ne produit pas IQueryable, il produit IEnumerable. Mauvaise réponse –

+0

@OmerK Où produit IQueryable, si l'objet sur lequel vous exécutez la méthode d'extension est également un IQueryable, si vous l'exécutez sur un IEnumerable, vous obtiendrez un IEnumerable. –

5

Faire usage de WhereIf méthode extenstion avaialbe dans LINQ

Exemple

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

au lieu d'aller au-dessus pour le dessous

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

LINQ WhereIf Extension Method

LINQ to SQL Where Clause Optional Criteria

+1

L'un des liens est mort et il n'y a rien de tel que "WhereIf" dans mon EF. – A1rPun

0

Je ne suis pas sûr de ce que la question est, mais une réponse possible pourrait être:

Oui,

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

Ce serait une façon compliquée de dire quelque chose de simple, cependant.

+0

comment cela sera possible avez-vous essayé? –

+1

Oui, au moins cela fonctionne avec linq-to-objects. –

+0

Ce qui est égal à: list.Where (item => Foo (item)); –

4

Je ne sais pas si cela est approprié, mais il est très utile, vous pouvez utiliser ifs assez haut la main avec conditionnelles où les clauses:

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

Ainsi, la clause where sera modifiée selon ce qui est en UUF1 ou UUF2-à-dire vous pourriez avoir seulement UUF1 avec l'information, auquel cas il prendra cela et ignorera la clause UUF2 où, vous pourriez avoir les deux dans lesquels il prendra les deux ou vous pourriez ne pas avoir n'importe quoi dans UUF1 ou 2 et votre clause where prendra juste le comme la clause where.

2

J'ai eu un scénario comme celui-ci où j'ai dû vérifier null dans la liste elle-même. C'est ce que j'ai fait.

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 

Mais comme Kelsey a souligné cela fonctionnerait aussi -

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

donc, si 'conditionquelconque' est faux, 'Où' sera sautée.

+0

Cela devrait vraiment être la réponse acceptée –

1

Dans mon cas, il y avait deux « conditionnel », où en fonction des clés de recherche, alors je l'ai:

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