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。