我听说 Episerver 中的 GetBySegment() 方法比使用 GetChildren().FirstOrDefault() 具有更好的性能。但我很难理解该方法的用法。
假设我有一个像这样的简单方法。它应该获得网站上应该只有 one 的页面类型,因此“FirstByDefault() 总是返回相同的页面。但是,位置、名称或 url 可能会根据不同的页面而有所不同。环境:
public virtual PageTypeA GetPageTypeA()
{
var pageTypeA = _contentLoader.GetChildren<PageTypeA>(rootPageReference).FirstOrDefault();
return pageTypeA;
}
是否可以将这里的“GetChildren().FirstOrDefault()”替换为GetBySegment()方法。据我了解,GetBySegment() 需要一个 urlSegment 字符串,但我不想对其进行“硬编码”,因为正如我所说,位置、名称或 url 可能会根据环境而变化。那么我该如何使用 GetBySegment() 或者是否可以在这里使用它?
我尝试过的是将 urlSegement“硬编码”到 GetBySegement 中,它会找到该页面,但由于我之前描述的原因,我不能这样做。
我不知道
GetBySegment
,但看过文档、代码和注释。
您正在将苹果与梨进行比较。两种方法不能互换使用。
ContentLoader/ContentRepository.GetChildren<T>
返回给定语言或 LoaderOptions(如果提供)中给定父项下给定类型的所有内容ContentLoader/ContentRepository.GetBySegment
返回给定父级下具有给定 RouteSegment 的所有内容(例如通过页面的“URL 中的名称”提供)。提供的 LoaderOptions(例如您要使用的语言)将被忽略,直到只有一个匹配项。这是有意的。所以加载器选项只是用来找到最佳匹配。因此,如果您想以给定语言获取父项下的所有子项,请使用
GetChildren
。如果您只想要一场比赛并且您关心的只是它的 RouteSegment,请使用 GetBySegment
。
关于性能:
GetChildren
被缓存,所以对第二次调用应该没有影响,特别是因为FirstOrDefault
基本上是无操作。