LINQ 如何与 Sitecore item.GetChildren() 一起使用?

How does LINQ work with Sitecore item.GetChildren()?

假设,我们有一行代码

item.GetChildren().Where(i => i.Name == "something");

其中项目的类型为 Sitecore.Data.Items.Item。

它是如何工作的?

1) 在调用 .GetChildren() 之后调用数据库查询,返回结果,然后 .Where(i => i.Name == "something") 在客户端发生

2) .Where(i => i.Name == "something") 被附加到数据库查询,并且仅在此之后调用数据库查询并返回结果?

或者两个选项都不正确?

GetChildren 调用将 return 项的所有子项,然后 Linq 语句将根据您的谓词过滤项集合。它不是在数据库查询级别完成的,而是在 Web 服务器上完成的(我假设这就是您所说的客户端而不是浏览器端的意思)。

为了分解它,Sitecore.Data.Items.Item.GetChildren() 调用 Sitecore.Data.Managers.ItemProvider.GetChildren(),这是通过 config/DI 设置的默认项目提供程序。这对数据库进行查询。这个 returns Sitecore.Collections.ChildList 正如你指出的那样继承自 IReadOnlyList<Item>, IReadOnlyCollection<Item>, IEnumerable<Item>, IEnumerable, ICollection.

Linq 语句然后使用 Where 扩展方法过滤项目。出于所有实际原因,这类似于使用 foreach 循环,仅添加与您的谓词匹配的项目,然后 returning 该列表。

根据你在做什么,你有多少项目,如果你遵循了每个节点不超过 100 个子项目的最佳实践,那么它应该不会导致任何重大的性能问题。