2012-03-27 11 views
5

にビューに文書を平坦化しますクライアントアプリケーションで必要な構造に変換されたデータを含むビューの望ましい結果を生成します。しかし、それは実際には冗長であり、メンテナンスの悪夢となり、すべての冗長なオブジェクト構築ではかなり効率が悪いでしょう。最も簡単な方法は、以下のクラスを考えるとRavenDB

文書(DocA)のコレクションがあれば、必要な構造(ViewA)でインデックスを作成する簡単な方法はありますか?

さらに詳しい情報 問題は、インデックスが変態組織(ViewA)にデータを保持させるために、我々は削減をしなければならないということであるように思われます。

INVALID CLAUSE 1 REDUCE::これは生産

 Reduce = results => from result in results 
         group on new ViewA 
         { 
          Id = result.Id, 
          Name = result.Name, 
          CurrencyName = result.CurrencyName 
         } into g 
         select g.Key; 

を:システムには、以下が有効ではありませんので、削減が期待どおりに動作するために、GROUP ONとSELECTの両方を持たなければならないことが表示されます。 InvalidOperationException:変数のイニシャライザ選択に、オブジェクト作成式を持つラムダ式が必要です。

明らかに「select new」が必要です。これはprduces

 Reduce = results => from result in results 
         select new ViewA 
         { 
          Id = result.Id, 
          Name = result.Name, 
          CurrencyName = result.CurrencyName 
         }; 

:System.InvalidCastExceptionの:型のオブジェクトをキャストすることができません 'ICSharpCode.NRefactory.Ast.IdentifierExpression'「をICSharpCode.NRefactory.Ast.InvocationExpressionを入力する

INVALID句2をREDUCE '

明らかに、私たちも 'group on new'を持っている必要があります。

ご協力いただきありがとうございます。

(注:コンストラクタ呼び出しからタイプ(ViewA)を除去して上記には影響ありません)正しいアプローチで

UPDATEを

ここでは、以下の回答で述べたダニエルさんのブログで概説したように

public class A_View : AbstractIndexCreationTask<DocA, ViewA> 
{ 
    public A_View() 
    { 
     Map = docs => from doc in docs 
         select new ViewA 
         { 
          Id = doc.Id, 
          Name = doc.Name, 
          CurrencyName = doc.Currency.Name 
         }; 

     // Top-level properties on ViewA that match those on DocA 
     // do not need to be stored in the index. 
     Store(x => x.CurrencyName, FieldStorage.Yes); 
    } 
} 
+0

ありがとう@Phill。私はここにあった他の答えに何が起こったのか分かりません... –

答えて

4

マップで単純に平坦化し、DocAに存在しないプロパティのみを格納するようにインデックスを構成する方法が1つあります。

public class A_View : AbstractIndexCreationTask<DocA, ViewA> 
{ 
    public A_View() 
    { 
     Map = docs => from doc in docs 
         select new ViewA 
         { 
          Id = doc.Id, 
          Name = doc.Name, 
          CurrencyName = doc.Currency.Name 
         }; 

     // Top-level properties on ViewA that match those on DocA 
     // do not need to be stored in the index. 
     Store(x => x.CurrencyName, FieldStorage.Yes); 
    } 
} 
+0

私はしばらくの間見ていたことにちょうどメモ;インデックスを使用して照会する元のエンティティを取得する場合は、次のようにします。 'DocumentSession.Query ()。ここで(x => x.CurrencyName == "ユーロ")。().First(); ' [ここにある](http://ayende.com/blog/152833/orders-search-in-ravendb) –

関連する問題