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 个子项目的最佳实践,那么它应该不会导致任何重大的性能问题。
假设,我们有一行代码
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 个子项目的最佳实践,那么它应该不会导致任何重大的性能问题。