我在项目中有一个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);
}
答案 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。