实际上我c#是这样写的:
db.Getin.Where(x => x.Status != "作废" && x.id != item.id && x.PreGetinId == item.PreGetinId).Sum(x => x.Amount) == 0
最终生成的代码
exec sp_executesql N'SELECT [GroupBy1].[A1] AS [C1] FROM ( SELECT SUM([Extent1].[Amount]) AS [A1] FROM [dbo].[Getin] AS [Extent1] WHERE ( NOT ((N''作废'' = [Extent1].[Status]) AND ([Extent1].[Status] IS NOT NULL))) AND ([Extent1].[id] <> @p__linq__0) AND (([Extent1].[PreGetinId] = @p__linq__1) OR (([Extent1].[PreGetinId] IS NULL) AND (@p__linq__1 IS NULL))) ) AS [GroupBy1]',N'@p__linq__0 uniqueidentifier,@p__linq__1 uniqueidentifier',@p__linq__0='0610AF2E-304D-4E5F-B9B7-13D66668FC68',@p__linq__1='8ECA5607-66F0-48DC-BE61-C3A74CE11F94'
这个语句只是难以理解而已,在执行性能上,并没有多少出入。
这个生成的原则是EF内置的一套通用的方案,考虑到兼容性,所以有些反复的查询操作,不必在意。
你仔细看下加粗部分
@Y2zz: 你是看到很多not,而不是简单的不等于之类的吧?这个跟linq的expression的构建有关。
我们在写一些方法或操作符的时候有个习惯:
1、实现相等操作
2、对不等操作直接调用相等操作的结果然后取非。
这里也是因为这个原因,所以:
a!=b
等价于 !(a==b)
当解析到a!=b的时候会转换为!(a==b),依此下去,就有了你的困惑了。
@Y2zz:
可能你还有个疑惑:
status != "作废"
怎么变成了
!(status = "作废" and status is not null)
这里多了个is not null,确实有点多此一举,具体的要进一步分析了。
@519740105: 谢谢解答,也算是安心了 不过我用对用的sql能查出数据,程序里得到的是null。我再找找原因。再次感谢!
@Y2zz: 检查下自动生成的SQL是否能获得数据,再去检查query是否有异常。