簡體   English   中英

LINQ 使用條件 where 生成錯誤查詢

[英]LINQ using conditional where generates wrong query

對於 C# .NET 核心應用程序,我需要調整現有的 LINQ 語句以包含基於 Z84E0ZEAZ5C4F385F2DA78 屬性的 WHERE 子句條件。 最重要的是,我希望查詢能夠處理過濾,因此我不會將太多數據拉入應用程序。

這是 LINQ 語句的示例

var SalesPrice = 25;
var myQuery = from tl in db.TransactionLines
            where (
                tl.SalesPrice > SalesPrice &&
                tl.TemplateType != 'SomeType' &&
                tl.VoucherNumber == null
            )
            select tl;

這將導致以下干凈簡單的 SQL

SELECT *
FROM   [rbo].[TransactionLines] AS [tl]
WHERE  (([tl].[SalesPrice] > 25) 
AND    (([tl].[TemplateType] <> 'SomeType') OR [tl].[TemplateType] IS NULL)) 
AND    [tl].[VoucherNumber] IS NULL

如果我添加條件以根據屬性更改 WHERE,則 LINQ 將如下所示

var SalesPrice = 25;
var SomeCondition = true;
var myQuery = from tl in db.TransactionLines
            where (
                tl.SalesPrice > SalesPrice &&
                tl.TemplateType != 'SomeType' &&
                SomeCondition ?
                    (tl.VoucherNumber == null) :
                    (tl.VoucherNumber != null || tl.VoucherNumber == null)
            )
            select tl;

這將生成以下不正確的查詢

SELECT *
FROM [rbo].[TransactionLines] AS [tl]
WHERE CASE
    WHEN ([tl].[SalesPrice] > 25) AND (([tl].[TemplateType] <> 'SomeType') OR [tl].[TemplateType] IS NULL)
    THEN CASE
        WHEN [tl].[VoucherNumber] IS NULL
        THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT)
    END ELSE CASE
        WHEN [tl].[VoucherNumber] IS NOT NULL OR [tl].[VoucherNumber] IS NULL
        THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT)
    END
END = 1

因為當我執行這個查詢時,它將返回所有記錄,而不是那些之前被SalesPrice > 25過濾掉的記錄。 正確的方法是什么? 或者有其他選擇嗎?

使用內聯條件時要小心。 您似乎忘記添加括號( , )

where (
    tl.SalesPrice > SalesPrice &&
    tl.TemplateType != 'SomeType' &&
    (SomeCondition ?
        (tl.VoucherNumber == null) :
        (tl.VoucherNumber != null || tl.VoucherNumber == null))
)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM