性能:LinqPad和Entity Framework为相同的Linq请求生成不同的SQL

时间:2012-06-28 01:35:27

标签: entity-framework linqpad

我想我从LinqPad doc了解到它使用与实体框架不同的linq到tsql翻译器。 LinqPad在至少一种情况下实际上更有效率!这是详细信息:

LinqPad生成以下简单的SQL查询:

SELECT [t0].[personId]
FROM [Person] AS [t0]
WHERE (NOT (([t0].[deleted]) = 1)) AND ([t0].[masterPersonId] = @p0)
ORDER BY [t0].[personId] DESC

对于这个C#linq代码:

int? state = null;
string realmId = null;
int? reviewerId = null;
bool? deleted = false;
long? parentPersonId = 1275660779659;

var query = from person in Persons
     where 
     (!deleted.HasValue || person.Deleted == deleted) && 
     (!state.HasValue || person.personState == state) &&
     (!parentPersonId.HasValue || person.masterPersonId == parentPersonId) && 
     (realmId == null || person.realmId == realmId) &&
     (reviewerId == null ||(person.reviewerId == reviewerId ))
     orderby person.personId descending
     select person.personId;

因此,您可以看到LinqPad转换上面的linq语句,并在参数值为null时删除无关的sql。尼斯!

EF但总是生成此,无论空参数如何:

SELECT 
[Extent1].[personId] AS [personId]
FROM [dbo].[Person] AS [Extent1]
WHERE (@p__linq__0 IS NULL OR [Extent1].[deleted] = @p__linq__1) AND 
(@p__linq__2 IS NULL OR [Extent1].[personState] = @p__linq__3) AND 
(@p__linq__4 IS NULL OR [Extent1].[masterPersonId] = @p__linq__5) AND 
(@p__linq__6 IS NULL OR [Extent1].[realmId] = @p__linq__7) AND 
((@p__linq__8 IS NULL) OR ([Extent1].[reviewerId] = @p__linq__9))

这使得查询速度变慢。我们希望使用LinqPad来评估为EF生成的sql,但显然不是如果结果会有所不同。看起来我们可以在LinqPad中为EF连接定位自定义程序集。我将使用它来查看我们是否至少可以将sql查询结合在一起。

任何人在这条路上旅行或知道我们可以利用的EF设置?我们正在运行EF4。

提前致谢。

1 个答案:

答案 0 :(得分:1)

我从LinqPad的作者那里找到了这个优秀的网络直播,他提到了这个问题。 http://oreilly.com/pub/e/1295

我使用的是Linq To SQL翻译而不是EF的。