如何使用乌鸦LoadDocument

问题描述 投票:3回答:2

我无法与查询的哪怕是最简单的查询RavenDB,可能是我做错了什么,但几个小时后,我看不出它了。我GOOGLE了几乎所有的东西我能想到的..

我有这些实体:

    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总是空。如果我不使用AsProjection方法,我不会得到任何结果。谁能告诉我的,我可以进一步体验,合适的例子吗?

谢谢。

_编辑:

这帮助了很多,谢谢:)现在的第二步,我很抱歉,如果我是一个有点newbish,但你必须从某个地方开始。在newsitems有意见,这些意见中还有另外一个参照用户ID。你可能已经猜到了我想做的事:我想与评论,以及评论的用户信息。

新的指标:

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

我怎样才能查询意见和扩大,结果?抑或是最好只为评论创建新的索引和获取用户信息模拟上述的解决?

ravendb
2个回答
4
投票

你几乎没有,你只需要存储你突出的领域。这增加了指数的构造,地图后。

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

这是因为你希望它返回,并且可以AsProjection找到。如果你只是想在一个地方或排序依据使用作者的名字,你就不需要它。


0
投票

如果你只是想,你可以简单的索引整个对象一起包括在你的AsProjection的意见。

注意索引的自定义对象将意味着您无法使用.Where()它来查询。 RavenDB只能在扁平的结果(整数,小数,字符串,日期)查询。

为了,例如,在标题查询,你需要创建一个单独的属性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);
}

}

© www.soinside.com 2019 - 2024. All rights reserved.