web-dev-qa-db-fra.com

Si condition dans la clause LINQ Where

Puis-je utiliser si clause avec Linq où?

27
Hasan

Oui, vous pouvez aimer:

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

Étant donné que Where produit une IQueryable, l'exécution est reportée au ToList dans mon exemple afin que vous puissiez enchaîner Wheres autant que vous le souhaitez, puis l'exécuter après avoir rempli toutes vos conditions.

38
Kelsey
var query = someList.Where(a => (someCondition)? a == "something" : true);

donc, si 'someCondition' est faux, 'Où' sera ignoré.

28
logical8

Utiliser la méthode WhereIf d'extension à avaialbe in linq 

Exemple 

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

au lieu d'en haut, optez pour le dessous 

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

Méthode d'extension LINQ WhereIf

LINQ to SQL Where Clause Critères facultatifs

6
Pranay Rana

Vous ne savez pas si cela est approprié, mais c'est très utile, vous pouvez facilement utiliser ifs avec des clauses conditionnelles où:

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

Donc, la clause where sera modifiée en fonction de ce qui est dans UUF1 ou UUF2, c’est-à-dire que vous n’avez que UUF1 avec info, auquel cas il faudra l’ignorer et ignorer la clause UUF2, vous pourriez avoir les deux dans lequel il faut prendre les deux peut ne rien avoir dans UUF1 ou 2 et votre clause where prendra simplement le accountid comme la clause where.

4
Ricardo Deano

Dans mon cas, il y avait deux "conditionnels", qui dépendaient des clés de recherche.

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

J'ai eu un scénario comme celui-ci où je devais 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 l'a fait remarquer, cela fonctionnerait aussi - 

items = items.Where(a => a.property1 != null);
2
Aswin Ramakrishnan
from item in items
where condition1
&& (condition2 ? true : condition3)
select item

Voici comment vous pouvez le faire avec la syntaxe noob Linq . Cela s'applique à la condition3 uniquement si la condition2 est fausse . Si la condition2 est vraie, vous faites essentiellement && true qui n'a aucun effet sur la clause where.

Donc, il s’agit essentiellement de ceci:

if(condition2)
{
    from item in items
    where condition1
    select item
else
{
    from item in items
    where condition1
    && condition3
    select item
}
0
Backwards_Dave

Je ne sais pas quelle est la question, 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
Felix Ungman