首页 新闻 会员 周边

entity framework 生成的SQL怎么这样了?

0
[已解决问题] 解决于 2014-08-22 08:57

实际上我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'

Y2zz的主页 Y2zz | 菜鸟二级 | 园豆:393
提问于:2014-08-22 08:37
< >
分享
最佳答案
1

这个语句只是难以理解而已,在执行性能上,并没有多少出入。

这个生成的原则是EF内置的一套通用的方案,考虑到兼容性,所以有些反复的查询操作,不必在意。

奖励园豆:5
519740105 | 大侠五级 |园豆:5810 | 2014-08-22 08:47

 你仔细看下加粗部分

Y2zz | 园豆:393 (菜鸟二级) | 2014-08-22 08:49

@Y2zz: 你是看到很多not,而不是简单的不等于之类的吧?这个跟linq的expression的构建有关。

我们在写一些方法或操作符的时候有个习惯:

1、实现相等操作

2、对不等操作直接调用相等操作的结果然后取非。

这里也是因为这个原因,所以:

a!=b

等价于 !(a==b)

当解析到a!=b的时候会转换为!(a==b),依此下去,就有了你的困惑了。

519740105 | 园豆:5810 (大侠五级) | 2014-08-22 08:53

@Y2zz: 

可能你还有个疑惑:

status != "作废"

怎么变成了

 

!(status = "作废" and status is not null)

 

这里多了个is not null,确实有点多此一举,具体的要进一步分析了。

519740105 | 园豆:5810 (大侠五级) | 2014-08-22 08:55

@519740105: 谢谢解答,也算是安心了 不过我用对用的sql能查出数据,程序里得到的是null。我再找找原因。再次感谢!

Y2zz | 园豆:393 (菜鸟二级) | 2014-08-22 08:56

@Y2zz: 检查下自动生成的SQL是否能获得数据,再去检查query是否有异常。

519740105 | 园豆:5810 (大侠五级) | 2014-08-22 08:59
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册