2009-08-31 14 views
2

J'utilise Linq et Entity Framework. J'ai une Entité de page, qui a une relation plusieurs-à-plusieurs avec une Entité de Balise.Création d'expressions Linq avec des variables

Je souhaite créer une requête Linq qui récupère toutes les pages correspondant à toutes les balises fournies (sous la forme d'un Int64 []).

J'ai essayé divers exemples WhereIn et BuildContainsExpression, mais aucun ne fonctionne comme prévu.

Je suis maintenant en train de boucle à travers chacune des balises et construire une liste d'expressions:

foreach (Int64 item in Tags) 
{ 
    Expression<Func<Pages, bool>> tagFilter = c => c.Tags.Any(x => x.TagID == item); 
    exp.Add(tagFilter); 
} 

Cependant, je pense que le « point » variable locale est de déconner avec la requête parce que ce dernier utilise un tag, ou aucun d'entre eux lorsque la requête est exécutée, si je les préciser comme ceci:

Expression<Func<Pages, bool>> tagFilter1 = c1 => c1.Tags.Any(x => x.TagID == 70); 
exp.Add(tagFilter1); 
Expression<Func<Pages, bool>> tagFilter2 = c1 => c1.Tags.Any(x => x.TagID == 130); 
exp.Add(tagFilter2); 
Expression<Func<Pages, bool>> tagFilter3 = c1 => c1.Tags.Any(x => x.TagID == 77); 
exp.Add(tagFilter3); 

Utilisation du nombre réel « 70 » par exemple, cela fonctionne comme un charme. Je stocke les expressions dans une liste et j'utilise LinqKit pour And() them.

Y at-il un moyen de garder cette dynamique?

Répondre

4

Changer votre code:

foreach (Int64 item in Tags) 
{ 
    var temp = item; // this variable is scoped **inside** the loop. 
    Expression<Func<Pages, bool>> tagFilter = c => c.Tags.Any(x => x.TagID == temp); 
    exp.Add(tagFilter); 
} 

Pour une explication détaillée, read my answer to the "What is the exact definition of a closure?" question.

+0

Il semble que tout le monde se heurte à ce problème au moins une fois en travaillant avec lambdas. Ils devraient vraiment chercher à en faire un avertissement du compilateur pour utiliser une variable portée dans un foreach/pour directement dans un lambda. – bobbymcr

+0

Merci beaucoup! –

Questions connexes