Если условие в пункте LINQ Where - PullRequest
       18

Если условие в пункте LINQ Where

28 голосов
/ 10 сентября 2010

Можно ли использовать оператор if с Linq где?

Ответы [ 8 ]

39 голосов
/ 10 сентября 2010

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

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

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

32 голосов
/ 19 июня 2014
var query = someList.Where(a => (someCondition)? a == "something" : true);

поэтому, если 'someCondition' равно false, 'Where' будет пропущено.

6 голосов
/ 10 сентября 2010

Используйте WhereIf метод расширения 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, где метод расширения

LINQ to SQL Where Clause Необязательные критерии

4 голосов
/ 10 сентября 2010

Не уверен, что это уместно, но это весьма полезно, вы можете использовать ifs очень удобно с условными предложениями 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);

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

3 голосов
/ 16 ноября 2015

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

    var query = db.Package.Include("SomeThing")
    .Where(item => searchString1 == null || searchString1 == "" || item.Contains(searchString1))
    .Where(item => searchString2 == null || searchString2 == "" || item.Contains(searchString2));
    ...
2 голосов
/ 21 марта 2012

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

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

Но, как указала Келси, это тоже сработало бы -

items = items.Where(a => a.property1 != null);
1 голос
/ 20 апреля 2018
from item in items
where condition1
&& (condition2 ? true : condition3)
select item

Вот как вы можете сделать это с помощью синтаксиса noob Linq.Это применяет условие 3, только если условие 2 ложно.Если условие 2 истинно, вы, по сути, выполняете && true, что никак не влияет на предложение where.

Таким образом, по сути, выполняется следующее:

if(condition2)
{
    from item in items
    where condition1
    select item
else
{
    from item in items
    where condition1
    && condition3
    select item
}
1 голос
/ 10 сентября 2010

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

Да,

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

Хотя это будет сложный способ сказать что-то простое.

...