Linq Count(条件)未按预期工作

时间:2012-09-27 11:02:04

标签: 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是否有任何限制?

1 个答案:

答案 0 :(得分:0)

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