EntityFramework LINQToEntities生成奇怪的慢TSQL Where-Clause

我需要了解这一点。 在TSQL代码生成中,EF5.0和EF6。*之间存在很大差异

在我的代码中,这是我的LINQ – statemant

var qry2 = context.viw_overview_1.Where(i => i.article_EAN17 == ean).Select(i => i.article_id).Take(200); 

EntityFramework 5.0只生成一个简单而快速的TSQL WHERE – 这样的语句,这是完美的

 ... WHERE [Extent1].[article_EAN17] = @p__linq__0 00.0960096ms in SSMS 

EntityFramework 6. *生成一个复杂而缓慢的语句

 ... WHERE (([Extent1].[article_EAN17] = @p__linq__0) AND ( NOT ([Extent1].[article_EAN17] IS NULL OR @p__linq__0 IS NULL))) OR (([Extent1].[article_EAN17] IS NULL) AND (@p__linq__0 IS NULL)) 45.3665362ms in SSMS 

字段article_EAN17也有一个索引。 但是EF6。*无论如何需要很长时间来初始化,但是有没有办法在EF6中生成一个简单的WHERE语句。*带有属性或类似的东西? 我尝试了string.Equals()string.Compare ()交换参数,但没有改变。

为什么Entity Framework 6为简单查找生成复杂的SQL查询? 解释差异,但有没有办法强制EF生成简单的TSQL。

我相信这与Entity Framework中的NULL比较设置有关

在查询之前添加以下代码,以查看它是否有助于您的查询性能:

 context.ContextOptions.UseCSharpNullComparisonBehavior = true; 

如果您绝对需要将添加的空检查切断,您可以始终使用DbSet.SqlQuery() ( 此处的文档)手动配置您希望它运行的查询(以及所有参数)。 但要小心,因为有时候这种方法可以以你不期望的方式工作。 如果您不想/需要任何跟踪,您也可以使用Database.SqlQuery() ( 此处的文档),这将允许您在查询中使用generics(否则您将不得不强制转换) 。

我个人更愿意不管它,还是使用存储过程,如评论中提到的@EricScherrer。