2011-03-30 4 views
4

Je veux effectuer l'équivalent d'une recherche SQL dynamique pour un produit avec des critères de recherche variables, mais en code C#. Par exemple, un produit est défini comme ceci:Lambda Expression Search

class Product 
{ 
    public decimal Price { get; set; } 
    public int Quantity { get; set; } 
} 

Mon contrôle de recherche a une zone de texte pour le prix et une zone de texte pour la quantité. Si l'utilisateur spécifie quelque chose, il doit être inclus dans la recherche (sinon, non). En réalité, mon produit a beaucoup plus de 2 propriétés.

Comment puis-je générer une expression lambda de manière générique sur la base d'une telle recherche par critères variables?

Merci!

+0

Il y a deux façons de réaliser ceci: 1) Construire des expressions (http: // msdn.microsoft.com/en-us/library/bb397951.aspx); 2) Utilisation de la méthode Where surchargée dans EntityFramework avec une chaîne comme paramètre (http://msdn.microsoft.com/en-us/library/bb338811.aspx). Je ne peux pas dire exactement quel est le meilleur moyen pour vous, cela dépend de la complexité du code. – vorrtex

Répondre

8

Plutôt que de construire une expression lambda, construire le bit de requête par bit:

IQueryable<Product> productQuery = db.Products; 

if (userHasSpecifiedPrice) 
{ 
    productQuery = productQuery.Where(p => p.Price == userSpecifiedPrice) 
} 
// etc 

Notez que ce ne sera pas exécuter la requête jusqu'à ce que vous commencez à utiliser les résultats.

La composition de requêtes est l'une des principales forces de LINQ. (La composition de l'arbre d'expression - ce que vous auriez à faire si vous vouliez un seul appel Where - est malheureusement plus difficile, malheureusement.)

+0

Merci! Suivi rapide: cette technique est-elle toujours préférée si j'ai besoin de "joindre" d'autres objets db (c'est-à-dire que le produit est dans l'entrepôt)? – John

+0

@John: Il devient plus difficile si vous avez besoin de * jointure * conditionnellement. Si votre jointure est inconditionnelle, alors ça devrait aller. –