c# - Linq 计数(条件)未按预期工作

标签 c# linq-to-sql

在下面的 Linq 查询中,生成的 SQL 忽略了 Count() 中的 c.val != null 检查

from t1 in table1
join t2 in table2 on t1.col1 equals t2.col1
where t1.col1 = 123 && t3.Count(c => c.val != null && c.col1 == t1.col1) == 0
select new {t1.col1, t2.col2, t1.col2}

翻译成

SELECT [t0].[col1], [t1].[col2], [t0].[col2]
FROM [t1] AS [t0]
INNER JOIN [t2] AS [t1] ON [t0].[col1] = [t1].[col1]
WHERE ([t0].[col1] = @p0) AND (((
    SELECT COUNT(*)
    FROM [t3] AS [t2]
    WHERE [t2].[col1] = [t0].[col1]
    )) = @p1)

而当只写以下内容时

t.Count(c => c.ID != null && t.No > 10)

翻译成

SELECT COUNT(*) AS [value]
FROM [t] AS [t0]
WHERE ([t0].[ID] IS NOT NULL) AND ([t0].[No] > @p0)

这里没有跳过 c.ID != null 检查。为什么会出现这种行为?在 where 子句中使用 Count 有什么限制吗?

最佳答案

这是因为优化。在 sql 中是 null=null false,这解释了为什么您不需要在第一个表达式中进行额外的 is null 检查(Linq 中的智能重写)。第二个表达式的转换没有使用 ==,因此使用了不同的优化。在这种情况下,解析器没有看到 ([t0].[ID] IS NOT NULL) 没有在 de sql 表达式中添加任何值。

关于c# - Linq 计数(条件)未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12619864/

相关文章:

c# - Visual Studio 编译器可以编译,但 ReSharper 显示编译错误

c# - 带有 ServiceStack 的 List 和 Dictionary 的 AngularJS 友好返回类型

c# - Windows 窗体 - ToolStripItem 可见属性始终设置为 false

c# - 如何在 SqLite Linq 查询中使用方法?

sql-server - 从 linq to sql 获取嵌套结果

sql-server - 如何使用 LINQ 将记录添加到数据库?

c# - 将具有对象列表的 json 绑定(bind)到模型

c# - 无法更改 Canvas.overrideSorting 属性

c# - 我如何转换int?进入整数

linq-to-sql - LINQ 查询中没有结果给出 IF ELSE 语句中未设置对象实例的对象引用