gpt4 book ai didi

entity-framework - 性能:LinqPad和 Entity Framework 为同一Linq请求生成不同的SQL

转载 作者:行者123 更新时间:2023-12-04 07:21:28 29 4
gpt4 key购买 nike

我想我从LinqPad文档中了解到,它使用与Entity Framework不同的linq to 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。

提前致谢。

最佳答案

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

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

关于entity-framework - 性能:LinqPad和 Entity Framework 为同一Linq请求生成不同的SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11237010/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com