首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Raven LoadDocument

如何使用Raven LoadDocument
EN

Stack Overflow用户
提问于 2013-03-05 22:53:52
回答 2查看 1.4K关注 0票数 3

我很难用最简单的查询来查询RavenDB,也许我做错了什么,但几个小时后我就看不见了。我搜索了几乎所有我能想到的..。

我有这样的实体:

代码语言:javascript
复制
    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特性,即索引:

代码语言:javascript
复制
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
                           };
    }
}

我试着用这样的方法:

代码语言:javascript
复制
var result = _documentSession.Query<NewsItemIndexWithComments.Result, NewsItemIndexWithComments>().AsProjection<NewsItemIndexWithComments.Result>().ToList();

现在我得到了列表中的文档数,但是AuthorName始终是空的。如果我不使用AsProjection方法,我就不会得到任何结果。有人能给我举一个合适的例子,我可以在上面做进一步的实验吗?

谢谢。

___编辑:

这很有帮助,谢谢:)现在对于第二步,如果我有点新潮的话,我很抱歉,但是你得从某个地方开始。在newsitems中有注释,在这些注释中有另一个对userid的引用。您可能会猜到我想做什么:我也想要评论的用户信息。

新指数:

代码语言:javascript
复制
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);
    }
}

评论类:

代码语言:javascript
复制
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; }
}

我如何查询注释并扩展结果呢?或者仅仅为注释创建一个新的索引,并将用户信息模拟到上面的解决方案更好吗?

EN

回答 2

Stack Overflow用户

发布于 2013-03-05 23:51:27

你快到了,你只需要存储你正在投射的区域。将其添加到映射后的索引构造函数中。

代码语言:javascript
复制
Store(x=> x.AuthorName, FieldStorage.Yes);

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

票数 4
EN

Stack Overflow用户

发布于 2016-06-17 00:15:30

如果您只想在您的AsProjection中包含注释,您可以简单地索引整个对象。

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

例如,为了查询标题,您需要创建一个独立的属性public string Title { get; set; }并将其映射到Title = newsItem.Title中。

代码语言:javascript
复制
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);
}

}

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15235723

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档