10
votes

LINQ: Comment exclure la condition si le paramètre est null

J'ai une table et la condition suivante de la requête: si le paramètre A est null prendre tout, sinon, l'utiliser dans la requête. Je sais comment faire cela en 2 étapes:

List<O> list = null;
if (A = null)
{
    list = context.Obj.Select(o => o).ToList();
}
else
{
    list = context.Obj.Where(o.A == A).ToList();
}


2 commentaires

Je pense que vous n'avez pas besoin du SELECT () là.


J'espère que vous voulez dire a == null ! (C # devrait garder cela de compiler, mais il est toujours préférable de faire en sorte que le code affiché est sous forme compilable appropriée. Il est important de critiquer le code posté parce que serait compilé [mais non travaillé comme prévu] dans certaines langues.)


4 Réponses :


22
votes

Que diriez-vous:

IEnumerable<O> query = context.Obj;
if (A != null)
{
    query = query.Where(o => o.A == A);
}
var list = query.ToList();


4 commentaires

De cette façon, la condition a == null serait évaluée pour chaque élément de la collection, bien que plus lisible, je ne pense pas qu'il soit totalement correct.


@ AS-CII, pas nécessairement. Ce serait le cas pour Linq aux objets. Mais cette requête ressemble à Linq à SQL ou quelque chose de similaire.


@svick - Bon point. Quoi qu'il en soit, je pense que c'est quelque chose qui ne devrait pas faire partie du où clause. Je veux dire, est la vérification de la nullabilité d'une variable client significative pour la requête?


@ AS-CII: Il est possible que la traduction de Linq à SQL remarquerait qu'il s'agit d'une valeur «vraie» constante et non d'envoi de la valeur ou même de l'une des clauses suivantes. Je ne dis pas que c'est particulièrement gentil - juste que c'est ce qui a été demandé.



3
votes

Je voudrais probablement écrire la requête comme ceci:

IQueryable<O> query = context.Obj;
if (A != null)
    query = query.Where(o => o.A == A);
var list = query.ToList()


0 commentaires

2
votes

ESSAYER

context.Obj.Where(a => A != null && a.A == A).ToList()


0 commentaires

5
votes

J'ai opté pour

var list = context.Obj.Where(o => A.HasValue ? o.a == A : true);


1 commentaires

résolu mon problème. Lorsque vous avez des paramètres NULL capables pour les actions de contrôleurs.