2011-12-26 3 views
0

私はRavenDBのマルチマップ/リダクションのコンセプトに苦しんでおり、最近マルチマップ/リダクションインデックスを正しく書く方法についてはthis questionと尋ねました。IList <T>マルチマップ/縮小結果ですか?

私はその質問で単純なインデックスを取得しましたが、もう少し複雑にしようとしたときには機能しません。私は何をしたいつまり、文字列のリストを格納するための指標の結果を持つことです。

class RootDocument { 
    public string Id { get; set; } 
    public string Foo { get; set; } 
    public string Bar { get; set; } 
    public IList<string> Items { get; set; } 
} 

public class ChildDocument { 
    public string Id { get; set; } 
    public string RootId { get; set; } 
    public int Value { get; set; } 
} 

class RootsByIdIndex: AbstractMultiMapIndexCreationTask<RootsByIdIndex.Result> { 
    public class Result { 
    public string Id { get; set; } 
    public string Foo { get; set; } 
    public string Bar { get; set; } 
    public IList<string> Items { get; set; } 
    public int Value { get; set; } 
    } 

    public RootsByIdIndex() { 
    AddMap<ChildDocument>(
     children => from child in children 
     select new { 
      Id = child.RootId, 
      Foo = (string)null, 
      Bar = (string)null, 
      Items = default(IList<string>), 
      Value = child.Value 
     }); 
     AddMap<RootDocument>(
     roots => from root in roots 
      select new { 
      Id = root.Id, 
      Foo = root.Foo, 
      Bar = root.Bar, 
      Items = root.Items, 
      Value = 0 
     }); 
     Reduce = 
     results => from result in results 
      group result by result.Id into g 
      select new { 
       Id = g.Key, 
       Foo = g.Select(x => x.Foo).Where(x => x != null).FirstOrDefault(), 
       Bar = g.Select(x => x.Bar).Where(x => x != null).FirstOrDefault(), 
       Items = g.Select(x => x.Items).Where(
       x => x != default(IList<string>).FirstOrDefault(), 
       Value = g.Sum(x => x.Value) 
       }; 
    } 
} 

基本的ChildDocumentsをマッピングするときに、私は(IListの)をデフォルトにItemsプロパティを設定しようとしたとの値にRootDocumentのItemsプロパティ。しかし、これはうまくいきません。無効なExprに

- ライン2 COL 324:ダブル.0.0を解析できません - ライン2 COL 285を

:それはリクエストに応じて、エラーメッセージ

エラーがクエリを理解できませんでした提供します

インデックスをアップロードするとき。マルチマップ/リダクションインデックスでリストを処理するにはどうすればよいですか?

答えて

3

インデックスでListを使用しないで、配列を使用してください。

2

David Davidは、RavenDBがLucene.NETでインデックスを保存していることを理解する必要があります。つまり、インデックス内に複雑な.net型を持つことはできません。

あなたの例では、IList<string>の代わりに単純なstringを使用することをお勧めします。

AddMap<ChildDocument>(
    children => from child in children 
    select new { 
     Id = child.RootId, 
     Foo = (string)null, 
     Bar = (string)null, 
     Items = (string)null, 
     Value = child.Value 
    }); 
    AddMap<RootDocument>(
    roots => from root in roots 
     select new { 
     Id = root.Id, 
     Foo = root.Foo, 
     Bar = root.Bar, 
     Items = string.Join(";", root.Items), 
     Value = 0 
    }); 
+0

私はちょうど私が格納できるものを指数化できると思っていました(そして、IList はうまくいきます)。 –

関連する問題