2010-09-10 4 views
1

Je veux générer requête dynamique pour vérifier gérer la clause where avec nombre de paramètres disponibles ... si un paramètre est nul, je ne veux pas l'inclure dans la clause whereutiliser si d'autre avec LINQ Où

var test = from p in _db.test 
      where if(str1 != null){p.test == str} else i dnt wanna check p.test 

J'ai environ 14 paramètres pour la clause where

besoin d'aide, grâce

Répondre

5

Vous pouvez le faire par étapes:

// set up the "main query" 
var test = from p in _db.test select _db.test; 
// if str1 is not null, add a where-condition 
if(str1 != null) 
{ 
    test = test.Where(p => p.test == str); 
} 
+0

Notez que parfois vous ne pourrez pas utiliser ici 'var' parce que le type de compilation '_db.test' peut être plus spécifique que le' IEnumerable 'renvoyé par' Where'. Notez également que vous ne pouvez pas utiliser seulement "de p dans _db.test" seul;) –

+0

j'ai autour de 14 paramètre pour la clause where..est-ce que cela signifie que je dois vérifier chaque paramètre ... y at-il n'importe quel moyen de rendre cette requête dynamique, et si plus d'un paramètre est nul :) – Hasan

+0

@Jon: ha, j'étais un peu distrait en écrivant donc j'ai oublié le select. Merci de l'avoir signalé. –

1

En plus de @ réponse de Fredrik, vous pouvez également utiliser les règles de court-circuit lors de l'évaluation des expressions booléennes comme ceci:

var test = from p in _db.test 
      where str1 == null || p.test == str1; 

Modifier Si vous avez beaucoup de cordes à tester, (str1, str2, etc ...), vous pouvez utiliser ce qui suit, qui sera traduit à une clause SQL IN:

var strings = new List<string>(); 
if (str1 != null) strings.Add(str1); 
if (str2 != null) strings.Add(str2); 
if (str3 != null) strings.Add(str3); 
... 

var test = from p in _db.test 
      where strings.Contains(p.test); 

Il est encore plus facile si vos cordes sont déjà dans une collection (qui, si vous avez 14 eux, je supposons qu'ils seraient ...)

+0

Si str1 == null Je ne veux pas vérifier p.test ... et j'ai 14 chaînes – Hasan

+0

des suggestions? – Hasan

+1

@Hasan: c'est exactement ce que @Dean écrit: si 'str == null',' p.test == str1' ne sera pas vérifié. –

1

Considérons param1 et param2 sont les paramètres. Votre requête doit être comme sous:

string param1 = "Value1"; 
string param2 = "Value2"; 

var q = from bal in context.FxBalanceDetails 
     where (string.IsNullOrEmpty(param1) || bal.Column1 == param1) 
       && (string.IsNullOrEmpty(param2) || bal.Column2 == param2) 
     select bal; 

Cela garantira que la clause where est appliquée pour le paramètre particulier uniquement lorsqu'il n'est pas null.

+0

Je ferais attention à tout faire dans une clause where. Je pense que si votre fournisseur linq (EF, L2S, NH, etc.) ne peut pas convertir quelque chose dans la clause where en SQL, vous finirez probablement par mettre toute la table en mémoire. – Ryan

+0

Oui, je comprends.LINQ peut parfois générer un code SQL assez désagréable. J'ai très bien utilisé cette méthode dans les SPs. –

0

Vérifiez-vous les chaînes par rapport au même champ de l'entité? Si oui, vous pouvez écrire quelque chose comme:

var strings = new[] { "foo", "bar", "ok", "", null }; 
var query = dataContext.YourTable.AsQueryable(); 
query = strings.Where(s => !string.IsNullOrEmpty(s)) 
     .ToList() 
     .Aggregate(query, (q, s) => q.Where(e => e.YourField == s)); 

EDIT: La solution précédente est excessivement complexe:

var strings = new[] { "foo", "bar", "ok", "", null }.Where(s => !string.IsNullOrEmpty(s)) 
     .ToList(); 
var query = dataContext.YourTable.Where(e => strings.Contains(e.YourField)); 
0
var test = 
from p in _db.test 
where p.str1 != null ? p.str1 : "" 
select p;