c# - LINQ 使用条件 where 生成错误查询
问题描述
对于 C# .NET Core 应用程序,我需要调整现有的 LINQ 语句以包含基于布尔属性的 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))
)
推荐阅读
- regex - 使用 sed 从多个文件中删除多行
- python - 2名玩家的掷骰子输入
- python - Python configparser 读取值中的注释
- python-3.x - 如何只将一行写入文件?
- swift - 为什么 Swift 没有正确加载这个视图,而 Objective-C 可以?
- python - 从 python 数据框创建嵌套 JSON
- c# - 在数据表中仅按列显示的正确方法是什么
- python-3.x - 即使在熊猫成功安装后,气流中也没有命名为熊猫的模块错误
- python - 如何在 Django 中为 css 和 js 文件创建公共文件夹?
- oracle - oracle如何查询一个月前执行的sql