在Sitecore 7中按名称获取项目的最有效方法
本文关键字:项目 有效 方法 获取 Sitecore | 更新日期: 2023-09-27 18:03:11
我在一个项目中有一个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);
}
Droplist
不是最幸运的选择。您应该使用Droplink
-它将项目存储为ID,而不是仅存储项目名称。
应该避免使用name作为项目标识符。可以有多个具有相同名称的项,甚至在同一个父项下。
homeItem.Axes.GetDescendants()
不是真正有效的方法。它获取该节点下的所有项。你应该避免使用它。
如果您知道该条目将是homeItem
的子条目,您可以使用:
homeItem.Children.FirstOrDefault(p => p.Name == itemName)
如果该项目可以在homeItem
下的任何级别,您可以尝试使用索引来获取该项目(检查项目名称等于指定的名称和项目全路径从主页全路径开始)。
这更像是一个信息提示,而不是答案。@Marek的答案是绝对正确的,你应该使用DropLink
来代替,这样你就可以直接处理项目的ID了。
从不(从来没有!永远不要!)在这样的调用中使用GetDescendants
(即从Home
向下)。我会尽量避免在任何地方使用它,永远:)[如果我能把GetDescendants
从API中烧掉,我会:P]
如果你考虑一下,你从Home
节点开始,然后向下迭代,在你去的时候访问每一个项目,它不会停止,直到它接触到每一个项目,从DB中取出每一个项目并询问它。在一个小型的开发网站上,这个操作会很快,但随着你的解决方案变得越来越大,随着内容编辑器创建越来越多的项目,你会发现你的解决方案变得越来越慢,你的SQL Server得到越来越多的负载(你可能不会立即知道为什么!)
如果你需要做一个更大范围的查询(即检查home
节点下的每个项目的字段),那么你应该看看Sitecore的ContentSearch
API,因为这对于做这些类型的操作来说要快得多。
正如@Stephen Pope提到的,通过名称搜索项目的最有效方法是通过ContentSearch。我最近给出了一个简单的内容搜索示例,您可以根据需要进行修改,添加以下行,以便它搜索Sitecore项目名称以找到具有匹配名称的项目。
IQueryable<SearchResultItem> query = index.GetQueryable<SearchResultItem>().Where(i => i.Name == itemName).Filter(predicate);
也值得遵循@Marek Musielak的建议,并在可能的情况下使用Droplink而不是Droplist,因此字段中包含的值是项目的ID,而不是它的名称,这在您的开发中更有用。
大多数人都答对了。我也建议这样做。
Droplink总是优于droplist,因为它存储的是项目ID而不是名称。与droplist相比,Droplink会给你更多的灵活性。
GetDescendants -循环遍历所有项目并检查,因此尽可能避免。相反,使用sitecore查询或快速查询可以提高效率。
masterDb.SelectItems("fast:/sitecore/content/Home//*[@@templateid = '{F348C2A0-73B8-4AF4-BD9E-2C5901908369}']");
没有人会将所有的项存储在同一个节点中。您可以在home节点下创建不同类型的项目。如果你想检索一组特定的项目,去sitecore查询而不是getdescendants。