我正在使用Linq和实体框架。我有一个页面实体,它与标记实体有多对多的关系。
我想创建一个Linq查询,该查询提取与所有提供的标签匹配的所有页面(以Int64 []的形式)。
我尝试了各种WhereIn和BuildContainsExpression示例,但没有一个按预期工作。
我现在正试图遍历每个标签并构建表达式列表:
foreach (Int64 item in Tags)
{
Expression<Func<Pages, bool>> tagFilter = c => c.Tags.Any(x => x.TagID == item);
exp.Add(tagFilter);
}
但是,我认为局部变量“item”正在搞乱查询,因为它要么使用一个标记,要么在查询运行时都不使用它们,但是如果我这样指定它们:
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);
例如,使用实际数字“70”,它就像一个魅力。我基本上将表达式存储在列表中,并使用LinqKit和And()它们。
有没有办法保持这种动态?
答案 0 :(得分:4)
将您的代码更改为:
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);
}
有关详细说明,read my answer to the "What is the exact definition of a closure?" question。