实体框架LINQ To Entities生成奇怪的慢速SQL Where-Clause

时间:2014-04-09 14:05:03

标签: c# sql linq entity-framework

我需要理解这一点。 在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(),交换参数,但没有任何改变。

Why does Entity Framework 6 generate complex SQL queries for simple lookups?解释了区别,但有没有办法强制EF生成简单的TSQL。

2 个答案:

答案 0 :(得分:8)

我认为这与Entity Framework

中的NULL比较设置有关

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

context.ContextOptions.UseCSharpNullComparisonBehavior = true;

答案 1 :(得分:1)

如果您绝对需要将添加的空检查切断,您可以随时使用DbSet.SqlQuery()(文档here)手动配置您想要的查询(以及所有参数)跑步。但要小心,因为有时候这种方法可能会以你不期望的方式运作。如果您不想要/不需要任何跟踪,您也可以使用Database.SqlQuery<T>()(文档here),这样您就可以在查询中使用泛型(否则您就可以了)必须施展它。)

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