c# - PredicateBuilder 剥离括号,打破嵌套的 AND 与 OR 的组合

标签 c# .net linq predicatebuilder

如何PredicateBuilder用于将带有嵌套 AND 的多个语句或在一起,而不去除括号?

我们试图得到:

(fieldA = X AND fieldB = Y AND fieldC = Z)  or (fieldA = A AND fieldB = B and fieldC = C)

但是下面的代码生成了(注意没有括号,意思是数据库查询返回了错误的数据)

fieldA = X AND fieldB = Y AND fieldC = Z  or fieldA = A AND fieldB = B and fieldC = C

我们正在像这样构建谓词:

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

foreach (var a in affected)
{
    var a1 = a;
    predicate = predicate.Or(m => m.ItemId == a1.ItemId && m.MinSeverity <= a1.Severity && m.LastUpdatedUtc <= a1.LastModifiedUtc);
}

var monitors = _monitoredServiceRepository.List(predicate);

最佳答案

在 LINQ 和 SQL Server 中(我很肯定这也是 MySQL、Oracle 和其他数据库的情况),先评估 AND 运算符,然后再评估 OR 运算符。

所以

(fieldA = X AND fieldB = Y AND fieldC = Z)  or (fieldA = A AND fieldB = B and fieldC = C)

相同
fieldA = X AND fieldB = Y AND fieldC = Z  or fieldA = A AND fieldB = B and fieldC = C

关于c# - PredicateBuilder 剥离括号,打破嵌套的 AND 与 OR 的组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20063539/

相关文章:

c# - 有没有更好的方法可以在不使用 ObservableCollection 的情况下加载列表?

.net - ASP.NET MVC 项目 "not supported by this installation"

c# - 获取 SortedDictionary 的子集作为 SortedDictionary

c# - LINQ - 聚合和计算多个参数

c# - 如何在 LINQ 查询中添加静态

c# - 如何为 WMI 查询设置超时?

c# - 如何在 C# Windows 窗体中使用 *** 在文本框中写入密码?

c# - 在 C# 中,++i vs i += 1 有什么性能差异吗?

c# - .net 的 SASL 库

sql-server - SQL 查询转换为 LINQ - DISTINCT 子计数