Ravendb 如何使用Raven LoadDocument
即使是最简单的查询,我也很难查询RavenDB,可能是我做错了什么,但几个小时后我再也看不到了。我几乎用谷歌搜索了我能想到的任何东西 我有以下实体:Ravendb 如何使用Raven LoadDocument,ravendb,Ravendb,即使是最简单的查询,我也很难查询RavenDB,可能是我做错了什么,但几个小时后我再也看不到了。我几乎用谷歌搜索了我能想到的任何东西 我有以下实体: public class User { public string Id { get; set; } public string DisplayName { get; set; } public string RealName { get; set; } public string Email { g
public class User
{
public string Id { get; set; }
public string DisplayName { get; set; }
public string RealName { get; set; }
public string Email { get; set; }
public string PictureUri { get; set; }
public List<Comment> Comments { get; set; }
public List<Role> Roles { get; set; }
}
public class NewsItem
{
public string Id { get; set; }
public string Title { get; set; }
public string Text { get; set; }
public DateTime Created { get; set; }
public string UserId { get; set; }
public List<Tag> Tags { get; set; }
public List<Comment> Comments { get; set; }
public List<WebImage> Images { get; set; }
}
我如何查询评论并扩展其结果?还是只为注释创建一个新索引,并获得与上述解决方案类似的用户信息更好?您就快到了,只需要存储要投影的字段。在映射之后,将其添加到索引构造函数中
Store(x=> x.AuthorName, FieldStorage.Yes);
这是因为您希望它返回并可供
AsProjection
查找。如果您只想在where或orderby中使用作者名称,则不需要它。如果您只想在AsProjection中包含注释,只需将整个对象编入索引即可
请注意,为自定义对象编制索引将意味着您无法使用.Where()
对其进行查询。RavenDB只能查询平坦的结果(整数、小数、字符串、日期)
例如,为了查询标题,您需要创建一个单独的属性publicstringtitle{get;set;}
,并将其映射到title=newsItem.title
public class NewsItemIndexWithComments : AbstractIndexCreationTask<NewsItem, NewsItemIndexWithComments.Result>
{
public class Result : NewsItem
{
public string AuthorName { get; set; }
public string AuthorId { get; set; }
public List<Comment> Comments { get; set; }
}
public NewsItemIndexWithComments()
{
Map = newsItems => from newsItem in newsItems
let user = LoadDocument<User>(newsItem.UserId)
select new
{
AuthorName = user.DisplayName,
AuthorId = user.Id,
Comments = newsItem.Comments.
};
Store(x => x.AuthorName, FieldStorage.Yes);
Store(x => x.AuthorId, FieldStorage.Yes);
Store(x => x.Comments, FieldStorage.Yes);
}
公共类NewsItemIndexWithComments:AbstractIndexCreationTask
{
公共类结果:NewsItem
{
公共字符串AuthorName{get;set;}
公共字符串AuthorId{get;set;}
公共列表注释{get;set;}
}
公共NewsItemIndexWithComments()
{
Map=newsItems=>来自newsItems中的newsItem
let user=LoadDocument(newsItem.UserId)
选择新的
{
AuthorName=user.DisplayName,
AuthorId=user.Id,
Comments=newsItem.Comments。
};
存储(x=>x.AuthorName,FieldStorage.Yes);
存储(x=>x.AuthorId,FieldStorage.Yes);
存储(x=>x.Comments,FieldStorage.Yes);
}
}这很有帮助!现在至少我得到了结果。但这给我留下了另一个问题(见编辑)。谢谢你的帮助:)我被你的对象模型弄糊涂了。您的
用户
和新闻项目
类中都嵌入了注释对象,但是注释
类中也有Id
。评论是在他们自己的文件中,还是其他文件的一部分?按照你们现在的方式,这两个地方都是非规范化的。你确定你不是想要一个列表CommentId?还有-这里有两种不同类型的评论吗?关于新闻项目的评论和关于用户的评论?或者你只是想表明评论是由某个特定的用户做出的?嗯,糟糕,用户类中根本不应该有任何评论。我真傻,我在到处乱翻代码,以至于忽略了这个错误。很抱歉给你带来了困惑。
public class NewsItemIndexWithComments : AbstractIndexCreationTask<NewsItem, NewsItemIndexWithComments.Result>
{
public class Result : NewsItem
{
public string AuthorName { get; set; }
public string AuthorId { get; set; }
}
public NewsItemIndexWithComments()
{
Map = newsItems => from newsItem in newsItems
let user = LoadDocument<User>(newsItem.UserId)
select new
{
AuthorName = user.DisplayName,
AuthorId = user.Id,
};
Store(x => x.AuthorName, FieldStorage.Yes);
Store(x => x.AuthorId, FieldStorage.Yes);
}
}
public class Comment
{
public string Id { get; set; }
public string Text { get; set; }
public string UserId { get; set; }
public string User { get; set; }
public DateTime Created { get; set; }
}
Store(x=> x.AuthorName, FieldStorage.Yes);
public class NewsItemIndexWithComments : AbstractIndexCreationTask<NewsItem, NewsItemIndexWithComments.Result>
{
public class Result : NewsItem
{
public string AuthorName { get; set; }
public string AuthorId { get; set; }
public List<Comment> Comments { get; set; }
}
public NewsItemIndexWithComments()
{
Map = newsItems => from newsItem in newsItems
let user = LoadDocument<User>(newsItem.UserId)
select new
{
AuthorName = user.DisplayName,
AuthorId = user.Id,
Comments = newsItem.Comments.
};
Store(x => x.AuthorName, FieldStorage.Yes);
Store(x => x.AuthorId, FieldStorage.Yes);
Store(x => x.Comments, FieldStorage.Yes);
}