在Sitecore 7中按名称获取项目的最有效方法是什么?

时间:2015-07-16 08:37:05

标签: c# sitecore sitecore7

我在项目中有一个Droplist字段,其中包含路径/sitecore/content/Home下的其他项目。我需要从Droplist获取所选项目。

在这种情况下,我必须通过其名称获取所选的Item。有没有其他有效的方法来做到这一点,或者我这样做的方式还好吗?

public static Item GetItemByName(string itemName)
{
    Database masterDb = Factory.GetDatabase("master");
    Item homeItem = masterDb.GetItem("/sitecore/content/Home");
    return homeItem.Axes.GetDescendants().FirstOrDefault(p => p.Name == itemName);
}

4 个答案:

答案 0 :(得分:4)

Droplist不是这里最幸运的选择。您应该使用Droplink - 它将项目存储为ID,而不是仅存储项目名称。

您应该避免使用name作为项标识符。可以有多个具有相同名称的项目,即使在同一父项下也是如此。

homeItem.Axes.GetDescendants()不是真正有效的方法。它获取该节点下的所有项目。你应该避免使用它。

如果您知道该项目是homeItem的孩子,则可以使用:

homeItem.Children.FirstOrDefault(p => p.Name == itemName)

如果该项目可以在homeItem下的任何级别,您可以尝试使用索引获取该项目(检查项目名称等于指定的名称,项目完整路径以主页完整路径开始)。< / p>

答案 1 :(得分:4)

这是一个比答案更多的信息说明.. @Marek的回答是绝对正确的,你应该使用DropLink代替,以便你直接解决项目的ID。

从不(从不! 从不!)在此类通话中使用GetDescendants(即从Home向下)。我会尝试并且避免在任何地方使用它,曾经:) [如果我可以将API GetDescendants烧掉,我会:P]

如果您考虑一下,您将从Home节点开始,然后向下迭代,随时访问每个项目,它不会停止,直到它触及每个项目,从数据库中提取每个项目审问它。在一个小的开发站点上,这个操作会很快但随着你的解决方案变得越来越大,随着内容编辑器创建越来越多的项目,你会发现解决方案变得越来越慢,你的SQL Server负载越来越多(你很可能不会马上就知道了!)

如果您需要进行更大范围的查询(即检查home节点下每个项目的字段),那么您应该查看Sitecore的ContentSearch API,因为这样做的速度要快得多各种各样的行动。

答案 2 :(得分:1)

正如@Stephen Pope所提到的,以最有效的方式通过名称搜索项目是通过ContentSearch。我最近给了一个simple Content Search example,您可以通过添加以下行来修改以满足您的需求,以便它搜索Sitecore项目名称以查找具有匹配名称的那些。

IQueryable<SearchResultItem> query = index.GetQueryable<SearchResultItem>().Where(i => i.Name == itemName).Filter(predicate);

同样值得关注@Marek Musielak的建议并尽可能使用Droplink over Droplist,因此字段中包含的值是Item的ID而不是其Name,这在您的开发中更有用。

答案 3 :(得分:0)

他们中的大多数都正确地给出了答案。我也会提出同样的建议。

Droplink始终优于droplist,因为它存储项ID而不是名称。 Droplink将为您提供很多下载列表的灵活性。

GetDescendants - 遍历所有项目并检查以尽可能避免。尽量使用sitecore查询或快速查询,这样可以提高效率。

masterDb.SelectItems("fast:/sitecore/content/Home//*[@@templateid = '{F348C2A0-73B8-4AF4-BD9E-2C5901908369}']");

没有人会将所有项目存储在同一节点中。您可以在主节点下创建不同类型的项目。如果要检索特定的项目集,请转到sitecore查询而不是getdescendants。