2010-09-10 2 views

ответ

33

Да, вы можете, как:

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

Поскольку Where производит в IQueryable, исполнение откладывается до ToList в моем примере, так что вы можете цепи Where S вместе столько, сколько вы хотите, а затем просто запустить его после того, как вы пройдете все свои условия.

+2

+1 Лучший ответ из трех. –

+0

Где не производится IQueryable, он производит IEnumerable. Неверный ответ –

+0

@OmerK Где на самом деле продукт IQueryable, если объект, на котором запущен метод расширения, также является IQueryable, если вы запустите его в IEnumerable, вы получите IEnumerable. –

5

использования делают из WhereIf метода extenstion avaialbe в LINQ

Пример

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

вместо того, чтобы идти на выше ниже

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

LINQ WhereIf Extension Method

LINQ to SQL Where Clause Optional Criteria

+1

Одна из ссылок мертва, и в моей EF нет такой вещи, как 'WhereIf'. – A1rPun

0

Я не уверен, что вопрос, но возможный ответ может быть:

Да,

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

Было бы сложным способом сказать что-то простое, хотя.

+0

Как это возможно, вы пробовали? –

+1

Да, по крайней мере, он работает с linq-to-objects. –

+0

Который равен: list.Where (item => Foo (item)); –

4

Не уверен, если это уместно, но это очень полезно, вы можете использовать сослагательное наклонение вполне сподручно с условными где пунктами:

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

Так где положение будет изменено в соответствии с тем, что в UUF1 или UUF2 т.е. у вас может быть только UUF1 с информацией, и в этом случае он примет это и проигнорирует предложение UUF2 where, у вас могут быть оба, в которых он будет брать оба или у вас может не быть ничего в UUF1 или 2, и ваше предложение where просто примет accountid как предложение where.

2

У меня был такой сценарий, когда я должен был проверить нуль в самом списке. Это то, что я сделал.

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 

Но Kelsey отметил, что это будет работать тоже -

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

так, если 'someCondition' ложно 'где' будет пропущен.

+0

Это действительно должен быть принятый ответ –

1

В моем случае были два «условно», где в зависимости от ключей поиска, так что я сделал:

var query = db.Package.Include("SomeThing") 
    .Where(item => searchString1 == null || searchString1 == "" || item.Contains(searchString1)) 
    .Where(item => searchString2 == null || searchString2 == "" || item.Contains(searchString2)); 
    ... 
Смежные вопросы