2012-05-02 9 views
0

RavenDBの変換を正しく理解しているように見える人がいたら、 Ayende's postに従ってみましたが、私の状況には適用できません。私はUserModelとUserAddressModelという2つのモデルを持っています。RavenDBの変換と単純なデータの結合

public class UserModel 
    { 
     #region Properties 

     public string Id { get; set; } 

     public string AccountId { get; set; } 

     public string UserName { get; set; } 

     public string FirstName { get; set; } 

     public string LastName { get; set; } 

     public string Email { get; set; } 

     public DateTime InsertDate { get; set; } 

     #endregion 
    } 

public class UserAddressModel 
    { 

     public string Id { get; set; } 

     public string AccountId { get; set; } 

     public string Address1 { get; set; } 

     public string Address2 { get; set; } 

     public string City { get; set; } 

     public string State { get; set; } 

     public string Zipcode { get; set; } 

     public float Latitude { get; set; } 

     public float Longitude { get; set; } 

     public DateTime InsertDate { get; set; } 

    } 

を次のようにコードは、私は私のRavenDB指数は、このようなように設定しています。

public class UserDashboard_ByName : AbstractIndexCreationTask<UserModel> 
    { 
     public UserDashboard_ByName() 
     { 
      Map = users => from user in users 
            select new { user.UserName, user.AccountId }; 

      TransformResults = 
       (database, users) => from user in users 
              let useraddress = database.Load<UserAddressModel>(user.AccountId) 
              select new 
                 { FirstName = user.FirstName, 
                  LastName = user.LastName, 
                  Address1 = useraddress.Address1, 
                  Address2 = useraddress.Address2 

                 }; 
     } 
    } 

と私は、次のコード

using (var session = DataDocumentStore.Instance.OpenSession()) 
      { 

       //Get the AccountId 
       var userDashboard = 
       (from user in session.Query<UserModel, UserDashboard_ByName>() 
       where user.UserName == userName 
       select user).SingleOrDefault(); 


      } 

私はインデックスを呼び出すと、それは私が期待していUserModelタイプではなく、匿名型を返すとそれを呼び出しています。また、私はどこか他のコードで指定しているか、具体的な関係が存在しない場合、私は

let useraddress = database.Load<UserAddressModel>(user.AccountId) 

を呼び出すことができる方法を理解していません。

誰かが私にRavenDBのデータをどのように参加させるべきか説明できますか?いくつかの拡張されたドキュメントやこれをより良く理解するための正しい方向のナッジは、非常に高く評価されます。前もって感謝します。あなたが戻りたい4つのプロパティを含むようUserWithAddressModelなど

あなたは(基本的にビューモデル)別のモデルを作成する必要があり

答えて

1

問題は、database.Load<UserAddressModel>(user.AccountId)を呼び出すTransformResult関数内にあります。 AccountIdのようなプロパティではなく、そのIDを持つUserAddressModelのみを読み込むことができます。

このようにするには、UserAddressModelのIDをUserModel内に格納する必要があります。しかし、私はそのようにモデル化しません。 UserAddressModel自体に意味がないため、おそらくUserModelの一部であるはずです。経験則として、一般的には集計のルートを文書として、それ以外はの中にのようにしたいと考えています。

1

、:

public class UserWithAddressModel 
    { 
     public string FirstName { get; set; } 
     public string LastName { get; set; }  
     public string Address1 { get; set; } 
     public string Address2 { get; set; } 
    } 

次に、このようなあなたのクエリを実行します。

var userDashboard = 
       (from user in session.Query<UserModel, UserDashboard_ByName>() 
       where user.UserName == userName 
       select user).As<UserWithAddressModel>().SingleOrDefault(); 

これはあなたが探しているものだと思います。

UPDATE

このようにしてみてください。

var userDashboard = session.Query<UserModel, UserDashboard_ByName>() 
    .Where(x => x.UserName == userName) 
    .As<UserWithAddressModel>() 
    .SingleOrDefault(); 

アップデート2:

申し訳ありませんが、ちょうどあなたがやろうとしているもので、再び見て、それがそのように動作しません。 UserModelのUserAddressModelへの参照があると思いました(UserAddressIdなど)。

2つのモデルを1:1の関係にすると、最初に2つのモデルを分割しているのはなぜですか?

+1

System.Linqエラーが発生します。IQueryable に 'As'の定義が含まれていません。助言がありますか? – jamesamuir

関連する問題