【发布时间】:2023-03-06 21:36:01
【问题描述】:
我一直在搜索我当前的问题,但我找不到解决该问题的真正答案。
我正在尝试构建一个生成以下 SQL 的 LINQ 查询:
SELECT * FROM TABLE WHERE (Field1 = X, Field2 = Y ... ) or (Field3 = Z)
在正常情况下,我会这样做:
Object.Where(c => (c.Field1 == X && c.Field2 == Y) || (c.Field3 == Z))
我不能使用这种方法,因为查询是通过使用多个 .Where() 调用构建的。
举个例子:
// This is a short example, the real world situation has 20 fields to check and they are all connected with an AND.
if (model.Field1.HasValue)
{
Query = Query.Where(c => c.Field1 == X)
}
if (model.Field2.HasValue)
{
Query = Query.Where(c => c.Field2 == X)
}
[...] like 20 more of these .Where() calls.
这就是我变得复杂的原因。所有这些.Where() 调用都在构建一个与AND 连接的Linq Query,这很好。
如何让它们使用括号执行并现在使用 API 添加一个简单的OR?
有没有办法将谓词保存在一些变量中,这样我就可以做类似的事情:
Query = Query.Where(c => previousPredicates || c.Field3 == X)
或者如何解决这个问题?
我认为这个特定问题必须有一个好的解决方案,而且我不是唯一需要它的人,但我绝对不确定如何实现它。
P.S:我无法真正删除多个 .Where() 调用,并且编写直接 SQL 也不是一种选择。
编辑
StackOverflow 想让我说出为什么我的问题与其他问题不同。好吧,事情是关于Parentheses。我不想将所有 .Where() 与单个 OR 子句连接起来,我想将它们与 AND 分开并添加另一个 OR 子句,同时所有 AND 查询都被括号括起来。
【问题讨论】:
-
不,它不是重复的。虽然另一个链接很有帮助,但它并没有真正解释如何实现括号,因为它只解释了如何用 `OR ` 替换所有 `AND ` 连接。
-
是的,它是重复的。在Jon Skeet's code 中,
someOtherCondition是可能包含多个ANDs 的表达式。然后这些AND块逐渐ORed 在一起。 -
另一个答案告诉你如何组合谓词。只需将
||替换为&&。然后你就可以做你想做的事了Query = Query.Where(c => previousPredicates || c.Field3 == X) -
假设字段可以为空,示例可以缩短为:
Query = Query.Where(c => c.Field1 ?? X == X && c.Field2 ?? X == X)。如果是实体框架查询,加标签,因为有些情况不适用