2013-03-05 30 views
3

即使是最简单的查询,我也无法查询RavenDB,可能我做错了什么,但几个小时后我再也看不到了。我GOOGLE了几乎所有的东西我能想到的..如何使用Raven LoadDocument

我有这些实体:

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中有评论,在这些评论中还有另外一个关于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; } 
} 

我如何可以查询的评论和扩大的结果吗?或者,仅仅为评论创建一个新索引并获得上述解决方案的用户信息模拟效果会更好?

回答

4

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

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

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

+0

这帮助!现在至少我得到了结果。但是这给我留下了另一个问题(请参阅编辑)。感谢您的帮助:) – neographikal 2013-03-06 08:48:46

+0

我对你的对象模型有点困惑。你在'User'和'NewsItem'类中嵌入了评论对象,但在你的Comment类中也有一个'Id'。是在他们自己的文件中的评论,还是其他文件的一部分?他们现在拥有它的方式在两个地方都是非规范化的。你确定你不是故意有一个'List CommentIds'?另外 - 这里有两种不同类型的评论吗?关于NewsItem的评论和关于用户的评论?或者你只是试图表明这些评论是由特定的用户做出的? – 2013-03-06 13:10:45

+0

呃,我的不好,根本不应该在用户课上有任何评论。愚蠢的我,我是这么洗牌的代码,我省略了这个错误。对困惑感到抱歉。 – neographikal 2013-03-06 17:51:05

0

因为这是loaddocument ravendb的热门搜索结果,我决定回答这些问题。

如果你只是想在你的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); 
} 

}