RavenDB转换和连接简单数据

时间:2012-05-02 19:50:48

标签: join ravendb transformation

我想知道是否有人可以帮助我理解RavenDB转换,因为我似乎无法让它们正常工作。我试过跟Ayende's post但是我无法将它应用到我的情况中。我有两个模型,一个UserModel和一个UserAddressModel。代码如下

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中加入数据?一些扩展的文档或正确的方向推动以更好地理解这一点将不胜感激。提前谢谢。

2 个答案:

答案 0 :(得分:1)

您需要创建另一个模型(基本上是一个视图模型),例如UserWithAddressModel,它包含您希望返回的4个属性:

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

UPDATE2:

对不起,再看看你想要做什么,它不会那样工作。我以为您在UserModel中引用了UserAddressModel(例如UserAddressId)。

如果它们是1:1关系,为什么要首先将这两个模型分开?

答案 1 :(得分:1)

问题出在您调用database.Load<UserAddressModel>(user.AccountId)的TransformResult函数中。您只能使用其ID加载UserAddressModel,而不能加载像AccountId这样的属性。

如果您想以这种方式执行,则必须将UserAddressModel的ID存储在UserModel中。但是,我不会以这种方式对其进行建模。 UserAddressModel本身没有任何意义,因此它应该是UserModel的一部分。根据经验,您通常希望将聚合根作为文档,将其他所有内容放在中。