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 Réponses :
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.
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);
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.
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.