gpt4 book ai didi

c# - Entity Framework ——底层SQL语句

转载 作者:行者123 更新时间:2023-11-30 14:57:30 26 4
gpt4 key购买 nike

这是我在 Entity 框架中执行的一个简单的 linq 查询

    db.Responses.FirstOrDefault(r => r.QuestionId.Equals(“1.1.1”) && r.User.Id.Equals(user.Id)   && !r.IsDeleted);

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

我启动了 Entity profiler 来查看底层发生了什么,底层的 SQL 查询似乎有一堆看起来有点多余的语句

/* 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 更改为非 null 可以简化查询

/* 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))

那么,问题是为什么 Entity Framework 要放入所有这些额外的代码?为什么需要第 4 行和第 6 行,where 子句中唯一相关的语句是第 3,5 和 7 行,

我正在尝试优化我的 SQL 语句,任何关于 Entity Framework 为何以这种方式做事的想法都会有所帮助。我在 Visual Studio 2013 中使用 EF6。

最佳答案

线条:

/* 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 控制行为。您可以找到更多详细信息 herehere .

关于c# - Entity Framework ——底层SQL语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20722569/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com