0

RavenDB 変換が正しく機能していないように見えるので、誰かが RavenDB 変換を理解するのを手伝ってくれるかどうか疑問に思っていました。Ayende の投稿に従ってみましたが、自分の状況に適用できません。UserModel と UserAddressModel の 2 つのモデルがあります。コードは次のとおりです。

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

2 に答える 2

1

問題は、を呼び出すTransformResult関数内にありますdatabase.Load<UserAddressModel>(user.AccountId)。AccountIdのようなプロパティではなく、IDを使用してUserAddressModelのみをロードできます。

そのようにする場合は、UserAddressModelのIDをUserModel内に保存する必要があります。ただし、そのようにモデル化することはしません。UserAddressModel自体には意味がないため、おそらくUserModelの一部である必要があります。経験則として、一般的には、集約されたルートをドキュメントとして、その他すべてをそのに入れたいと考えています。

于 2012-05-02T22:21:05.330 に答える
1

返したい 4 つのプロパティを含む UserWithAddressModel など、別のモデル (基本的にはビュー モデル) を作成する必要があります。

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

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

更新

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

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

更新 2:

申し訳ありませんが、あなたがやろうとしていることをもう一度見てください。そのようには機能しません。UserModel に UserAddressModel への参照があると思いました (UserAddressId など)。

2 つのモデルが 1:1 の関係である場合、そもそもなぜ 2 つのモデルを分割するのですか?

于 2012-05-02T20:52:11.150 に答える