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();