【发布时间】:2011-12-28 23:17:04
【问题描述】:
我在生成的部分类上有一个方法,如下所示:
var pChildren = this.Children
.Skip(skipRelated)
.Take(takeRelated)
.ToList();
当我查看我的 SQL Server 时,我可以看到生成的代码正在执行 SELECT *.* FROM Children 此代码直接取自我的课程,我已验证我的 Skip/Take 顺序在我的 .ToList 之前。
如果我删除 .ToList,该行很快(并且没有 SQL 发送到我的数据库),但是当我尝试 foreach 超过结果时,我收到相同的 SQL 发送到我的数据库:@987654324 @。
在我的实体的导航属性上使用 .Skip 和 .Take 时,我需要做些什么特别的事情吗?
更新
我将尝试生成实际的 SQL,我目前还没有为此设置。我找到了第一个,因为它出现在 SSMS 的“最近昂贵的查询”列表中。
运行这个:
var pChildren = this.Children
//.Skip(skipRelated)
//.Take(takeRelated)
.ToList();
返回约 4,000,000 行,耗时约 25 秒。
运行这个:
var pChildren = this.Children
//.Skip(skipRelated)
.Take(takeRelated)
.ToList();
返回约 4,000,000 行,耗时约 25 秒。
正如我所说,我将获取为这些生成的 SQL 并将它们也摆出来。
【问题讨论】:
-
您希望这段代码生成什么 SQL?
-
我希望有类似
SELECT TOP 10 FROM Children WHERE ParentID = @idOfParentEntity的东西(我忘记了 EF 是如何处理 .Skip 的,但我已经读过它应该这样做了。如果我直接针对我的上下文执行此查询,它似乎会限制返回到特定“页面”的数据) -
在没有 Skip/Take 的情况下执行此查询并再次在没有 Take 的情况下执行此查询并发布为每个查询生成的 SQL 可能很有用。其中之一可能是问题所在。
-
@cdhowie - 例如,您可以在 SQL Server 中使用
ROW_NUMBER返回10-20之间的行。 -
能否显示通过以下命令执行的实际查询
((ObjectQuery<Child>)this.Children.Skip(skipRelated).Take(takeRelated)).ToTraceString()
标签: c# .net entity-framework sql-server-2008-r2 navigation-properties