gpt4 book ai didi

c# - Entity Framework 导航属性上的 .Skip().Take() 正在我的 SQL Server 上执行 SELECT *

转载 作者:太空狗 更新时间:2023-10-29 18:32:39 24 4
gpt4 key购买 nike

我在生成的分部类上有一个这样的方法:

var pChildren = this.Children
.Skip(skipRelated)
.Take(takeRelated)
.ToList();

当我查看我的 SQL Server 时,我可以看到生成的代码正在执行 SELECT *.* FROM Children 此代码直接取 self 的类,我已经验证了我的顺序Skip/Take 在我的 .ToList 之前。

如果我删除 .ToList,那条线很快(并且没有 SQL 发送到我的数据库),但是当我尝试 foreach 结果时,我得到了相同的 SQL 发送到我的数据库:SELECT *.* FROM Children

在我的实体的导航属性上使用 .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,并将它们也设置好。

最佳答案

问题是当您查询这样的子集合时,您正在执行 LINQ-to-Object 查询。 EF 将加载整个集合并在内存中执行查询。

如果您使用的是 EF 4,您可以这样查询

var pChildren = this.Children.CreateSourceQuery()
.OrderBy(/* */).Skip(skipRelated).Take(takeRelated);

在 EF 4.1 中

var pChildren = context.Entry(this)
.Collection(e => e.Children)
.Query()
.OrderBy(/* */).Skip(skipRelated).Take(takeRelated)
.Load();

关于c# - Entity Framework 导航属性上的 .Skip().Take() 正在我的 SQL Server 上执行 SELECT *,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8662365/

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