为什么Entity Framework 6为简单查找生成复杂的SQL查询? [英] Why does Entity Framework 6 generate complex SQL queries for simple lookups?
问题描述
我有这个LINQ查询
dbContext.Customers.Where(c => c.AssetTag == assetTag).Count();
或
(from c in dbContext.Customers
where c.AssetTag == assetTag
select c).Count();
生成的SQL是
SELECT
[GroupBy1].[A1] AS [C1]
FROM ( SELECT
COUNT(1) AS [A1]
FROM [dbo].[Customer] AS [Extent1]
WHERE (([Extent1].[AssetTag] = @p__linq__0) AND ( NOT ([Extent1].[AssetTag] IS NULL OR @p__linq__0 IS NULL))) OR (([Extent1].[AssetTag] IS NULL) AND (@p__linq__0 IS NULL))
) AS [GroupBy1]
那么为什么LINQ为简单的where语句生成这样复杂的SQL?
So why does LINQ generate such complex SQL for a simple where statement?
推荐答案
在EF6中,数据库为null语义是默认的比较语义。请注意,这是EF5中默认设置的更改。在EF5中,这个标志被埋在 ObjectContext.ContextOptions.UseCSharpNullComparisonBehavior ,默认情况下,EF将使用Linq对象比较语义。在EF6中,它在DbContext上显示为 DbContext.Configuration.UseDatabaseNullSemantics 。你可以找到更多的细节 here
In EF6 the database null semantics is the default comparison semantics. Note that this is a change to the default setting in EF5. In EF5 this flag was buried in ObjectContext.ContextOptions.UseCSharpNullComparisonBehavior and by default EF would use Linq to Object comparison semantics. In EF6 it is exposed on DbContext as DbContext.Configuration.UseDatabaseNullSemantics. You can find more details here
这篇关于为什么Entity Framework 6为简单查找生成复杂的SQL查询?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!