我正在使用 Linq 和 Entity Framework 。我有一个页面实体,它与标签实体具有多对多关系。
我想创建一个 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() 它们。
有办法保持这种动态吗?
最佳答案
将代码更改为:
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 .
关于linq - 使用变量构建 Linq 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1355269/