2016-08-29 40 views
1

我正在使用Sitecore 7第一次潛入ContentSearchAPI,但遇到了一些麻煩。對於一個假設的問題,我決定編寫一個搜索,爲我的站點索引整個樹,抽出兩個模板中的一個,並駐留在特定路徑中。該查詢的代碼是:Sitecore內容搜索,轉換爲列表<item>並編輯

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,因此它不會繼承項目的方法,包括編輯.BeginEdit()之類的。我玩弄了LINQ查詢,並將Cast()或OfType()與ToList()結合使用,但不斷收到錯誤,指出我無法將SearchResultItem轉換爲Item。

閱讀Sitecore POCO似乎讓我朝着正確的方向發展,但這似乎更多的是關於定義要閱讀的字段。有沒有辦法將一個SearchResultItem轉換爲一個項目,並打開該項目進行編輯?使用LINQ和ContentSearch API,我是否需要創建一個POCO,定義我想要的字段,然後使用POCO對其進行修改?

回答

4

你可以做的是將您的結果轉換成項目的集合:

var itemList= results.Hits.Select(i => i.Document.GetItem()); 

通過這種方式,可以通過每個項目迭代和編輯字段的值你以前做的方式。

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