首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实体框架-基础SQL语句

实体框架-基础SQL语句
EN

Stack Overflow用户
提问于 2013-12-21 19:13:28
回答 2查看 922关注 0票数 3

下面是我在实体框架中执行的一个简单的linq查询

代码语言:javascript
复制
    db.Responses.FirstOrDefault(r => r.QuestionId.Equals(“1.1.1”) && r.User.Id.Equals(user.Id)   && !r.IsDeleted);

这里,QuestionId是一个varchar数据类型列,db是上下文对象。

我启动了实体分析器来查看引擎盖下发生了什么,底层的SQL查询似乎有一堆看起来有些多余的语句。

代码语言:javascript
复制
/* 1 */    SELECT TOP (1) *
/* 2 */    FROM   [dbo].[Responses] AS [Extent1]
/* 3 */    WHERE  ((([Extent1].[QuestionId] = '1.1.1' /* @p__linq__0 */)
/* 4 */     AND (NOT ([Extent1].[QuestionId] IS NULL
/* 5 */                OR '1.1.1' /* @p__linq__0 */ IS NULL)))
/* 6 */     OR (([Extent1].[QuestionId] IS NULL)
/* 7 */         AND ('1.1.1' /* @p__linq__0 */ IS NULL)))
/* 8 */    AND ([Extent1].[UserId] = 1 /* @p__linq__1 */)
/* 9 */    AND (1 /* @p__linq__1 */ IS NOT NULL)
/* 10 */   AND ([Extent1].[IsDeleted] <> cast(1 as bit))

请注意第4-7行中的所有额外代码,将QuestionId更改为not null可以简化查询。

代码语言:javascript
复制
/* 1 */    SELECT TOP (1) *
/* 2 */    FROM   [dbo].[Responses] AS [Extent1]
/* 3 */    WHERE  ([Extent1].[QuestionId] = '1.1.1' /* @p__linq__0 */)
/* 4 */    AND ('1.1.1' /* @p__linq__0 */ IS NOT NULL)
/* 5 */    AND ([Extent1].[UserId] = 1 /* @p__linq__1 */)
/* 6 */    AND (1 /* @p__linq__1 */ IS NOT NULL)
/* 7 */    AND ([Extent1].[IsDeleted] <> cast(1 as bit))

那么,问题是为什么实体框架要添加那么多的代码呢?为什么第4行和第6行是必要的,where子句中唯一相关的语句是第3、5和7行,

我正在尝试优化我的SQL语句,任何关于实体框架为什么会这样做的想法都是有帮助的。我在2013中使用EF6。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-21 20:17:01

这是因为字符串'1.1.1‘作为sql命令参数传递,而SQL生成器对参数的值一无所知。Ef不会根据值生成不同的语句。语句必须正确,即使传递的值为null。

如果当列为空时,列和参数值都为空,则等于必须为true。当它不可空时,只有当传递的值不是null时,它才能为真。

EF所做的每一件事都是100%有效的,并且是非常正确的实现。除非你得到了错误的结果,否则不要试图优化。

票数 2
EN

Stack Overflow用户

发布于 2013-12-21 21:14:09

台词:

代码语言:javascript
复制
/* 3 */    WHERE  ((([Extent1].[QuestionId] = '1.1.1' /* @p__linq__0 */)
/* 4 */     AND (NOT ([Extent1].[QuestionId] IS NULL
/* 5 */                OR '1.1.1' /* @p__linq__0 */ IS NULL)))

应该解释C#/VB.NET和SQL之间空比较的语义差异。可以使用DbContext.Configuration.UseDatabaseNullSemanticsObjectContextOptions.UseCSharpNullComparisonBehavior控制行为。您可以找到更多的细节,这里这里

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20722569

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档