Ravendb 如何使用Raven LoadDocument

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

即使是最简单的查询,我也很难查询RavenDB,可能是我做错了什么,但几个小时后我再也看不到了。我几乎用谷歌搜索了我能想到的任何东西

我有以下实体:

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