linq - 使用变量构建 Linq 表达式

标签 linq entity-framework lambda

我正在使用 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/

相关文章:

c# - Entity Framework 。删除表中的所有行

Linq 查询执行全文搜索

c# - ASP.NET MVC 5项目中VS2017连接MySQL

.net - 如何在不使用字符串名称的情况下引发 PropertyChanged 事件

c++ - C++ 中的性能比较(普通函数调用与 for_each+mem_fun 与 lambda 表达式)

c# - 如何使用 Linq 和 ASP.Net Forms 在多个表之间编写联接

c# - 如何计算 C# 解决方案中没有注释和空行以及其他冗余内容等的代码行数?

entity-framework - 如何使用 Entity Framework Code First 为我的数据库提供种子?

c# - 需要 linq 查询只返回最后 100 个结果

Peek 中的 Java 8 条件逻辑?