2011-10-06 3 views
1

J'ai une instruction linq qui renvoie une liste d'enregistrements basée sur la clause where
Cette clause where vérifie deux valeurs de paramètre.
Hors duquel un paramètre est facultatif.
donc je besoin d'un suggestions si je peux changer mon clause where basé sur le paramètre optionnel
quelque chose comme çaLinq où changement de clause basé sur les paramètres

if(locid==0) 
    { 
    where (p.CustomerID == custid) 
    } 
else{ 
    where (p.CustomerID == custid) & (p.LocationID == locid) 
    } 

peut me aider comment puis-je obtenir ce travail.

grâce

Répondre

2

Vous pouvez essayer d'écrire comme ceci:

where (p.CustomerID == custid) && (locid == 0 || p.LocationID == locid) 
3

Oui - Les requêtes peuvent être composés (bien que vous n'avez pas besoin de ce pour ce cas particulier @rsbarro souligné):

var query = p; 

if(locid==0) 
    query = query.Where(p =>p.CustomerID == custid); 
else 
    query = query.Where(p =>p.CustomerID == custid & p.LocationID == locid); 

//any other conditions 
1

Comme mentionné BrokenGlass, vous devez utiliser la composition:

IQueryable<Foo> query = unfiltered.Where(p => p.CustomerID == custId); 
if (locid != 0) 
{ 
    query = query.Where(p => p.LocationID == locid); 
} 

Notez que la requête est et non exécutée jusqu'à ce que vous commenciez à lire des données à partir de celle-ci, vous n'avez donc pas besoin de vous inquiéter à propos de cette requête multiple.

Il semblerait que dans votre message original, vous essayiez d'utiliser la syntaxe de requête au coup par coup - cela ne fonctionnera pas, mais la "notation par points" est assez simple ici. Vous pouvez toujours créer votre requête initiale en utilisant une expression de requête si vous voulez - encore une fois, cette requête ne sera pas exécutée immédiatement de toute façon.