0
votes

Combinez plusieurs conditions where ayant des paramètres facultatifs dans C # linq?

Je recherche une requête LINQ où j'ai 3 paramètres et deux sont des paramètres optionnels pour cela J'ai écrit des conditions if-else comme ci-dessous

if (id != null) { where condition} 
else if (name!= null) { where condition } 
else if (category != null) { where condition } 
else if (id != null && name != null) { where condition } 
else if (id != null && category != null) { where condition } 
else if (name != null && category != null) {where condition} 
else if (id != null && name != null && category != null ) { where condition } 

Je ne veux pas écrire plus si -else conditionne si un autre paramètre facultatif est ajouté

Remarque . L'ID n'est pas une clé primaire


3 commentaires

C’est ... valide?!?


Quoi qu'il en soit, je pense que vous cherchez peut-être quelque chose comme Where (x => (q == null || x.q == q) && ..); c'est-à-dire que les protecteurs sont déplacés À L'INTÉRIEUR du filtre. Sinon filtres CHAIN: f = ..; if (q! = null) {f = f. Où (x => x.q == q); }


Être des paramètres optionnels n'est pas en soi pertinent.


3 Réponses :


0
votes

Vous pouvez l'écrire comme ceci

id == null || {id condition} &&
id == null || {id condition} &&

Ou

id == null ? true : {id condition} &&
name == null ? true : {name condition} &&
category == null ? true: {category } and other conditions

renvoyer true rendra la déclaration vraie si sa valeur est égale à null. c'est propre, facile à comprendre et à développer.

J'espère que cela aide.


0 commentaires

0
votes

Ce que je fais toujours est ci-dessous. Facile à lire et à mémoriser.

myList
    .Where(x => id == null || x.Id == id)
    .Where(x => name == null || x.Name == name)
    .Where(x => category == null || x.Category == category);


0 commentaires

1
votes

Le modèle optimal pour cela dans EF est d'ajouter les conditions Where uniquement de manière conditionnelle. EG

IQueryable<SomeType> qry = ...;
if (id != null)
{
  qry = qry.Where(x => x.Id == id);
}
if (name != null)
{
  qry = qry.Where(x => x.Name == name);
}
if (category != null)
{
  qry = qry.Where(x => x.Category == category);
}
var results = qry.ToList();

De cette façon, vous n'encombrez pas l'expression avec beaucoup de prédicats qui ne font rien, mais qui peuvent gâcher l'exécution de la requête.


0 commentaires