2016-08-29 9 views
1

私はSitecore 7でContentSearchAPIへの最初のダイビングを行っていますが、少し問題があります。仮説的な問題では、自分のサイトのツリー全体を索引付けし、2つのテンプレートのうちの1つであり、特定のパスにあるアイテムを取り出します。クエリのコードは次のとおりです。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(); 
} 

検索は必要なアイテムをつかむ。しかし、今ではアイテムを編集モードで開き、そのアイテムのフィールドの値を変更したいと考えています。私はサイトコアのクエリで働いていたときに以前、私はこれを達成するために、次のようなものを使用します。

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をItemに変換してアイテムを編集用に開く方法はありませんか? 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(); 
関連する問題