Sitecore 内容搜索,转换为列表<item> 并编辑
Sitecore Content Search, converting to List<item> and editing
我第一次使用 Sitecore 7 研究 ContentSearchAPI,但遇到了一些小麻烦。对于一个假设的问题,我决定编写一个搜索来为我的站点的整个树编制索引,提取属于两个模板之一并位于特定路径中的项目。查询代码为:
using (var context = index.CreateSearchContext())
{
var results = context.GetQueryable<SearchResultItem>()
.Where(item => item.TemplateId == GlobalId.UniversalContent
|| item.TemplateId == GlobalId.UniversalHome)
.Where(item => item.Path.Contains("/sitecore/content"))
.GetResults();
}
到目前为止一切都很好;搜索抓取所需的项目。但现在我想在编辑模式下打开该项目并更改该项目的字段值。以前当我使用 Sitecore 查询时,我使用类似下面的东西来完成这个:
foreach (Item i in itemList)
{
using (new SecurityDisabler())
{
i.Editing.BeginEdit();
i.Fields["DoNotIndex"].SetValue("1", true);
i.Editing.EndEdit();
}
}
但是LINQ查询的return类型是SearchResultItem,因此不继承Item方法,包括Editing.BeginEdit()等。我试过 LINQ 查询并结合使用 Cast() 或 OfType() 和 ToList(),但不断收到错误消息,指出我无法将 SearchResultItem 转换为 Item。
阅读 Sitecore POCO 的文章似乎让我朝着正确的方向前进,但这似乎更多地是关于定义要阅读的字段。没有办法将 SearchResultItem 转换为 Item 并打开该项目进行编辑吗?使用 LINQ 和 ContentSearch API,我是否需要创建一个 POCO,定义我想要的字段,然后使用 POCO 修改它?
您可以将结果转换为项目集合:
var itemList= results.Hits.Select(i => i.Document.GetItem());
这样,您就可以遍历每个项目并像以前那样编辑字段值。
您可以使用下面的代码来做同样的事情 -
results = context.GetQueryable<SearchResultItem>()
.Where(item => item.TemplateId == GlobalId.UniversalContent
|| item.TemplateId == GlobalId.UniversalHome)
.Where(item => item.Path.Contains("/sitecore/content"))
.Select(i => (Item)i.GetItem()).ToList();
我第一次使用 Sitecore 7 研究 ContentSearchAPI,但遇到了一些小麻烦。对于一个假设的问题,我决定编写一个搜索来为我的站点的整个树编制索引,提取属于两个模板之一并位于特定路径中的项目。查询代码为:
using (var context = index.CreateSearchContext())
{
var results = context.GetQueryable<SearchResultItem>()
.Where(item => item.TemplateId == GlobalId.UniversalContent
|| item.TemplateId == GlobalId.UniversalHome)
.Where(item => item.Path.Contains("/sitecore/content"))
.GetResults();
}
到目前为止一切都很好;搜索抓取所需的项目。但现在我想在编辑模式下打开该项目并更改该项目的字段值。以前当我使用 Sitecore 查询时,我使用类似下面的东西来完成这个:
foreach (Item i in itemList)
{
using (new SecurityDisabler())
{
i.Editing.BeginEdit();
i.Fields["DoNotIndex"].SetValue("1", true);
i.Editing.EndEdit();
}
}
但是LINQ查询的return类型是SearchResultItem,因此不继承Item方法,包括Editing.BeginEdit()等。我试过 LINQ 查询并结合使用 Cast() 或 OfType() 和 ToList(),但不断收到错误消息,指出我无法将 SearchResultItem 转换为 Item。
阅读 Sitecore POCO 的文章似乎让我朝着正确的方向前进,但这似乎更多地是关于定义要阅读的字段。没有办法将 SearchResultItem 转换为 Item 并打开该项目进行编辑吗?使用 LINQ 和 ContentSearch API,我是否需要创建一个 POCO,定义我想要的字段,然后使用 POCO 修改它?
您可以将结果转换为项目集合:
var itemList= results.Hits.Select(i => i.Document.GetItem());
这样,您就可以遍历每个项目并像以前那样编辑字段值。
您可以使用下面的代码来做同样的事情 -
results = context.GetQueryable<SearchResultItem>()
.Where(item => item.TemplateId == GlobalId.UniversalContent
|| item.TemplateId == GlobalId.UniversalHome)
.Where(item => item.Path.Contains("/sitecore/content"))
.Select(i => (Item)i.GetItem()).ToList();