我想知道是否有人可以帮助我理解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中加入数据?一些扩展的文档或正确的方向推动以更好地理解这一点将不胜感激。提前谢谢。
答案 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的一部分。根据经验,您通常希望将聚合根作为文档,将其他所有内容放在中。