如何使用Raven LoadDocument

时间:2013-03-05 22:53:52

标签: ravendb

即使是最简单的查询我也无法查询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; } 
 }

我想查询这些,所以我得到了一个newsItems列表,但是附带了用户信息。所以我阅读了文档并尝试了LoadDocument功能,索引:

public class NewsItemIndexWithComments : AbstractIndexCreationTask<NewsItem, NewsItemIndexWithComments.Result>
{

    public class Result
    {
        public string AuthorName { get; set; }
    }

    public NewsItemIndexWithComments()
    {
        Map = newsItems => from newsItem in newsItems
                           select new
                           {
                               AuthorName = LoadDocument<User>(newsItem.UserId).DisplayName
                           };
    }
}

我尝试使用如下:

var result = _documentSession.Query<NewsItemIndexWithComments.Result, NewsItemIndexWithComments>().AsProjection<NewsItemIndexWithComments.Result>().ToList();

现在我获取了列表中的文档数,但AuthorName始终为null。如果我不使用AsProjection方法,我将不会得到任何结果。有人能告诉我一个适当的例子,我可以进一步试验吗?

感谢。

_ 编辑:

这帮助了很多,谢谢:)现在第二步,我很抱歉,如果我有点新鲜,但你必须从某个地方开始。在newsitems中有注释,在这些注释中还有另一个对userid的引用。你可能猜到我想做什么:我也想要评论的用户信息以及评论。

新指数:

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

如何查询评论并扩展结果?或者更好的是为评论创建一个新索引,并获得与上述解决方案类似的用户信息?

2 个答案:

答案 0 :(得分:4)

你几乎就在那里,你只需要存储你正在投射的领域。在地图之后将其添加到索引构造函数。

Store(x=> x.AuthorName, FieldStorage.Yes);

这是因为您希望它返回并可供AsProjection查找。如果您只想在where或orderby中使用作者姓名,则不需要它。

答案 1 :(得分:0)

如果您只想在AsProjection中包含注释,则只需将整个对象编入索引即可。

请注意,索引自定义对象意味着您无法使用.Where()对其进行查询。 RavenDB只能查询展平结果(整数,小数,字符串,日期)。

例如,为了查询标题,您需要创建一个单独的Property public string Title { 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);
}

}