当我使用由OR
连接的两个条件时,SQL Server的结果不正确。
我该如何解决?
这是我的LINQ代码并导致SQL(为我创建的反射):
query.Where(p => ((p.Code == "100000") Or p.Code.EndsWith("200")))
query.Where(p => (p.year == "2015"))}
我在运行时添加了这个where
子句,现在我添加了另一个扩展方法,它不起作用:
query.sum(p => p.value)
例外:
Microsoft.EntityFrameworkCore.dll中发生了'System.Data.SqlClient.SqlException'类型的异常,但未在用户代码中处理
附加信息:在。中指定的非布尔类型的表达式 预期条件的上下文,靠近'AND'。
SQL翻译:
SELECT SUM([e].[Value])
FROM [acc].[Data161] AS [e]
WHERE (CASE
WHEN RIGHT([e].[Code], LEN(N'201')) = N'201'
THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT)
END |
CASE
WHEN RIGHT([e].[Code], LEN(N'199')) = N'199'
THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT)
END)
AND ([e].[SetadCode] = N'161')
正确的SQL应该在= 1
之前有AND
。
但是没有总和它的工作正常并且向SQL命令添加= 1
答案 0 :(得分:1)
您可以使用||
代替or
query.Where(p => ((p.Code == "100000") || p.Code.EndsWith("200")))
答案 1 :(得分:1)
首先,Or
不是有效的C#运算符
.Where(p => ((p.Code == "100000") Or p.Code.EndsWith("200")))
如果将其更改为||
,则查询会正确转换并执行无问题。
查看生成的SQL,我非常确定您使用了bitwise或operator(|
),在这种情况下,我得到了相同的错误。虽然这可能是EF Core转换程序错误,但您无论如何都不应该使用它 - 使用逻辑或||
运算符,生成的SQL将不具有所有CASE WHEN
表达式,而是典型的简单的WHERE
条件。
答案 2 :(得分:0)
这对评论来说太长了,但没有解决问题的linq部分。
我希望where
子句看起来像这样:
where (code = '100000' or p.code like '%200') and (p.year = '2015')
生成的所有位操作都是不和谐的。请注意,上面的代码也是ANSI标准SQL。