在 Sitecore 7 中按名称获取项目的最有效方法?
Most efficient way to get item by name in Sitecore 7?
我在一个项目中有一个 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,而不是仅存储项目名称。
您应该避免使用名称作为项目标识符。可以有多个同名的项目,即使在同一个父项下。
homeItem.Axes.GetDescendants()
并不是真正有效的方法。它获取该节点下的所有项目。你应该避免使用它。
如果您知道该项目将是 homeItem
的子项目,您可以使用:
homeItem.Children.FirstOrDefault(p => p.Name == itemName)
如果该项目可以在homeItem
下的任何级别,您可以尝试使用索引来获取该项目(检查项目名称等于指定名称和项目完整路径以主页完整路径开头) .
这更多的是信息说明,而不是答案。@Marek 的回答是绝对正确的,您应该使用 DropLink
来代替,以便直接解决项目的 ID。
从不(从不! 从不!)在这样的调用中使用 GetDescendants
(即来自 Home
向下)。我会尽量避免在任何地方使用它,永远 :) [如果我能从 API 中烧掉 GetDescendants
,我会 :P]
如果您考虑一下,您是从 Home
节点开始,然后向下迭代,边走边访问每一个项目,直到它触及每个项目,从中拉出每个项目,它才会停止DB 并询问了它。在小型开发站点上,此操作会很快,但随着您的解决方案变得越来越大,随着内容编辑器创建越来越多的项目,您会发现您的解决方案变得越来越慢,并且您的 SQL 服务器负载越来越大(你可能不会立即知道为什么!)
如果您需要进行更大范围的查询(即检查 home
节点下每个项目的字段),那么您应该查看 Sitecore 的 ContentSearch
API执行此类操作的速度要快得多。
正如@Stephen Pope 提到的,按名称搜索项目的最有效方法是通过内容搜索。我最近给出了一个 ,您可以通过添加以下行来根据您的需要进行修改,以便它搜索 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 - 遍历所有项目并进行检查,因此尽量避免 possible.instead 使用 sitecore 查询或快速查询,这样可以提高效率。
masterDb.SelectItems("fast:/sitecore/content/Home//*[@@templateid = '{F348C2A0-73B8-4AF4-BD9E-2C5901908369}']");
没有人会把所有的项目都存储在同一个节点中。您会在主节点下创建不同类型的项目。如果您想检索一组特定的项目,请使用 sitecore 查询而不是 getdescendants。
我在一个项目中有一个 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,而不是仅存储项目名称。
您应该避免使用名称作为项目标识符。可以有多个同名的项目,即使在同一个父项下。
homeItem.Axes.GetDescendants()
并不是真正有效的方法。它获取该节点下的所有项目。你应该避免使用它。
如果您知道该项目将是 homeItem
的子项目,您可以使用:
homeItem.Children.FirstOrDefault(p => p.Name == itemName)
如果该项目可以在homeItem
下的任何级别,您可以尝试使用索引来获取该项目(检查项目名称等于指定名称和项目完整路径以主页完整路径开头) .
这更多的是信息说明,而不是答案。@Marek 的回答是绝对正确的,您应该使用 DropLink
来代替,以便直接解决项目的 ID。
从不(从不! 从不!)在这样的调用中使用 GetDescendants
(即来自 Home
向下)。我会尽量避免在任何地方使用它,永远 :) [如果我能从 API 中烧掉 GetDescendants
,我会 :P]
如果您考虑一下,您是从 Home
节点开始,然后向下迭代,边走边访问每一个项目,直到它触及每个项目,从中拉出每个项目,它才会停止DB 并询问了它。在小型开发站点上,此操作会很快,但随着您的解决方案变得越来越大,随着内容编辑器创建越来越多的项目,您会发现您的解决方案变得越来越慢,并且您的 SQL 服务器负载越来越大(你可能不会立即知道为什么!)
如果您需要进行更大范围的查询(即检查 home
节点下每个项目的字段),那么您应该查看 Sitecore 的 ContentSearch
API执行此类操作的速度要快得多。
正如@Stephen Pope 提到的,按名称搜索项目的最有效方法是通过内容搜索。我最近给出了一个
IQueryable<SearchResultItem> query = index.GetQueryable<SearchResultItem>().Where(i => i.Name == itemName).Filter(predicate);
同样值得遵循@Marek Musielak 的建议并尽可能使用 Droplink 而不是 Droplist,这样字段中包含的值是项目的 ID 而不是它的名称,这在您的开发中更有用。
大部分都答对了。我也会提出同样的建议。
Droplink 总是优于 droplist,因为它存储项目 ID 而不是名称。与 droplist 相比,Droplink 会给你很大的灵活性。
GetDescendants - 遍历所有项目并进行检查,因此尽量避免 possible.instead 使用 sitecore 查询或快速查询,这样可以提高效率。
masterDb.SelectItems("fast:/sitecore/content/Home//*[@@templateid = '{F348C2A0-73B8-4AF4-BD9E-2C5901908369}']");
没有人会把所有的项目都存储在同一个节点中。您会在主节点下创建不同类型的项目。如果您想检索一组特定的项目,请使用 sitecore 查询而不是 getdescendants。