使用linq for Or條件的條件求和

c# entity-framework-core linq sql-server

當我使用由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')

AND之前,正確的SQL應該具有= 1

但沒有總和它的工作正常,並添加一個= 1到SQL命令

一般承認的答案

首先, Or不是有效的C#運算符

.Where(p => ((p.Code == "100000") Or p.Code.EndsWith("200")))

如果您將其更改為|| ,查詢正確翻譯並執行無問題。

看看生成的SQL,我很確定你已經使用了bitwise或operator( | ),在這種情況下我得到了同樣的錯誤。雖然這可能是EF Core轉換器錯誤,但您不應該使用它 - 使用邏輯或||運算符和生成的SQL不會具有所有CASE WHEN表達式,而是典型的簡單WHERE條件。


熱門答案

你可以使用||而不是or

query.Where(p => ((p.Code == "100000") || p.Code.EndsWith("200")))


Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因