我正在第一次使用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查询的返回类型是SearchResultItem,因此它不会继承Item方法,包括Editing.BeginEdit()等。我使用LINQ查询并使用Cast()或OfType()与ToList()结合使用,但不断收到错误,指出我无法将SearchResultItem转换为Item。
阅读Sitecore POCO似乎把我带到了正确的方向,但这似乎更多地是关于定义要阅读的字段。有没有办法将SearchResultItem转换为Item并打开项目进行编辑?使用LINQ和ContentSearch API,我是否需要创建POCO,定义我想要的字段然后使用POCO修改它?
答案 0 :(得分:5)
您可以做的是将结果转换为项目集合:
var itemList= results.Hits.Select(i => i.Document.GetItem());
通过这种方式,您可以迭代每个项目并按照以前的方式编辑字段值。
答案 1 :(得分:0)
您可以使用以下代码执行相同操作 -
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();