使用 Linq PredicateBuilder 嵌套 OR

2023-12-21

我正在使用谓词生成器编写以下代码:

IEnumerable<int> ids= new List<int> { 47, 48 };

var predicate = PredicateBuilder.False<Customer>();

predicate = predicate.And(x => x.CreatedAt >= fromDate && x.CreatedAt <= toDate);

foreach (var id in ids)
{
    predicate = predicate.Or(x => x.Source.Id == id);
}

var result = Database.Set<Customer>().AsExpandable()
                                     .Where(predicate)
                                     .ToList();

生成的 SQL 如下所示(仅 WHERE 子句):

WHERE ([Filter6].[SourceId] IN (@p__linq__0,@p__linq__1))
AND ([Filter6].[CreatedAt] >= @p__linq__2)
AND ([Filter6].[CreatedAt] <= @p__linq__3)',
N'@p__linq__0 int,
@p__linq__1 int,
@p__linq__2 datetime2(7),
@p__linq__3 datetime2(7)',
@p__linq__0=48,
@p__linq__1=48,
@p__linq__2='2012-02-07 21:59:55.0437985',
@p__linq__3='2012-02-07 22:04:55.5748288'

看起来 id 48 在 SQL 中被分配了两次。不知道为什么?


foreach (var id in ids)
{
    predicate = predicate.Or(x => x.Source.Id == id);
}

您正在关闭循环变量。制作您的本地副本id变量代替:

foreach (var id in ids)
{
    int localId = id;
    predicate = predicate.Or(x => x.Source.Id == localId);
}

由于 Linq 是懒惰的Or谓词,因此id仅当您执行查询时才会评估,此时value of id是最后一项ids收藏。的行为foreach这方面将在 C# 5 中进行更改,这将不再是问题。欲了解更多信息,请阅读“关闭循环变量被认为是有害的” http://blogs.msdn.com/b/ericlippert/archive/2009/11/12/closing-over-the-loop-variable-considered-harmful.aspx

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Linq PredicateBuilder 嵌套 OR 的相关文章

  • LINQ to SQL 选择“按多列区分”并返回整个实体

    我正在使用第三方数据库 需要为我正在研究的特定市场选择一组不同的数据 每个市场的数据都是相同的 因此将其全部引入是多余的 并且我不想硬编码围绕它的任何逻辑 因为我们正在与供应商合作解决问题 但我们需要一个修复程序与供应商合作修复以及数据库当
  • LINQ 中的左外连接

    下面的代码不断给我一个错误消息 你调用的对象是空的 var partsWithDefaults from partsList1 in p join partsList2 in d on new PartNo partsList1 PartN
  • 列表:Count 与 Count() [重复]

    这个问题在这里已经有答案了 给定一个列表 首选哪种方法来确定内部元素的数量 var myList new List
  • LINQ 分组依据和选择集合

    我有这个结构 Customer has many Orders has many OrderItems 我想生成一个列表CustomerItems通过 LINQ 给出的子集OrderItems List of new Customer Li
  • SQL 与 LINQ 性能 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 将 Linq 函数存储到变量中并动态定义?

    我有一个像这样的 Linq 查询 var results StudentsList GroupBy x gt x GroupID GroupBy x gt x Any g gt g IsQualified true Select g gt
  • 仅使用 LINQ 对包含数字属性的对象集合求和

    我有一个像这样的对象模型 public class Quantity public decimal Weight get set public decimal Volume get set perhaps more decimals pub
  • 在 PowerShell 中调用静态通用 LINQ 扩展方法

    人们可以使用以下简单的表示法在 PowerShell 中调用许多 LINQ 方法 int numbers 1 10000 Linq Enumerable Sum numbers 在调用中包含 lambda 甚至是一件相对简单的事情 Func
  • 实体框架将本地数据添加到数据库中的列表

    我对实体框架相当陌生 我正在使用此方法来查询我的数据库 var context new StudioEntities var results context tblStudios Select u gt new u Standort u N
  • 如何包装实体框架以在执行前拦截 LINQ 表达式?

    我想在执行之前重写 LINQ 表达式的某些部分 我在将重写器注入正确的位置时遇到问题 实际上根本没有 查看实体框架源代码 在反射器中 它最终归结为IQueryProvider Execute在 EF 中 它通过以下方式耦合到表达式Objec
  • 从通用列表中删除项目

    我有以下方法 我希望从我的收藏中删除与产品 ID 匹配的项目 看起来相当简单 但我有一个例外 基本上我的收藏已经不同步了 那么从集合中删除项目的最佳方法是什么 public void RemoveOrderItem Model Order
  • 使用 linq 组合对象

    我有一个类的 2 个实例 它实现了IEnumerable界面 我想创建一个新对象并将它们合并为一个 我明白我可以使用for each去做这个 有 linq lambda 表达式的方法可以做到这一点吗 EDIT public class Me
  • 分组为连续整数范围

    我检查了其他帖子 包括使用 Linq 按可变整数范围进行分组 https stackoverflow com questions 1375997 group by variable integer range using linq 但我没有
  • LINQ:获取表详细信息

    我正在使用 LINQPad 我想了解表的架构详细信息 我知道我是用 SQL 来做的 SELECT column name FROM information schema columns WHERE table name table name
  • 使用 List.Contains 方法为 LINQ 构建表达式树

    Problem 我正在重构一些LINQ查询我们的 Web 应用程序中的多个报告 并且我尝试将一些重复的查询谓词移至它们自己的中IQueryable扩展方法 以便我们可以将它们重新用于这些报告以及将来的报告 正如您可能推断的那样 我已经重构了
  • Linq 到自定义 SQL

    好的 我有一个带有巨大表的数据库 超过 100 万条记录和 50 多个列 我知道它不是最佳的 但它是我必须处理的 所以我需要运行限制返回数据量的查询 现在我的问题是这样的 我有一些运行并返回数据的自定义查询 用户可以通过选择将生成谓词模板并
  • 使用 Linq to Entities 查询创建 null ienumerable

    我正在开发一个使用实体框架的 ASP NET MVC 项目 我需要将从数据库中提取的值投影到PropertyValue类型 如下所示 public class PropertyValue public string StringValue
  • Dynamic Linq 的执行延迟 IQueryable

    我在用动态链接 https www nuget org packages System Linq Dynamic执行一些查询 抱歉 但这是我唯一的选择 结果 我得到了IQueryable而不是IQueryable
  • LINQ:从类型 T 的列表中,仅检索某个子类 S 的对象

    给定一个简单的继承层次结构 人 gt 学生 教师 职员 假设我有一个人员列表 L 该列表中有一些学生 教师和工作人员 使用 LINQ 和 C 有没有办法编写一个只能检索特定类型人员的方法 我知道我可以做类似的事情 var peopleIWa
  • 使用 Enumerable.OfType() 或 LINQ 查找特定类型的所有子控件

    Existed MyControl1 Controls OfType

随机推荐