使用linq for Or condition的条件求和

时间:2016-12-18 13:44:32

标签: c# sql-server linq entity-framework-core

当我使用由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

3 个答案:

答案 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。