如何使用嵌套列表创建索引

时间:2014-03-09 17:06:01

标签: c# linq comments ravendb

我有一个名为question的文档集合。 我的模型如下

问题包含评论。评论具有状态和日期。

对于每个问题,我要将最新评论的状态设为根级属性。

我知道我需要一个静态索引,我尝试过各种各样的东西。我知道我可以用一个像

这样的问题来做
(from x in question.Comment
orderby x.date 
select x.status).Take(1).FirstOrDefault()

但是我无法弄清楚如何将它作为整个集合的索引。

我也尝试查询结果以返回问题并注明我正在寻找的状态,但这会抛出一个否定的Any()错误。

from x in Session.Query<Question>()
 where !(from y in x.Comments
        where ListOfStatusesCommentShouldntHave.Contains(y.Status) select y).Any()
 select x)

2 个答案:

答案 0 :(得分:1)

如果我理解你的问题,这应该有效:

var results = Session.Query<Question>()
    .Select(q => q.Comments.OrderBy(c => c.Date).FirstOrDefault().Status);

答案 1 :(得分:0)

我们做了类似的事情并使用Map Reduce索引来查询索引上的嵌套属性。为此,您需要创建一个扩展AbstractIndexCrationTask<T, U>的索引,如下所示:

public class DiscussionTopicPosts_Index : AbstractIndexCreationTask<DiscussionTopicPosts, DiscussionTopicPosts_Index.Post>
{
    public class Post
    {
        public string DiscussionTopicPostsId { get; set; }

        public int Id { get; set; }

        public string Message { get; set; }

        public Guid PostedByLearnerId { get; set; }

        public DateTime InsertedUTC { get; set; }
    }

    public DiscussionTopicPosts_Index()
    {
        Map = topicPosts => from p in topicPosts
                            from post in p.Posts
                            where post.IsEnabled == true
                            select new
                            {
                                DiscussionTopicPostsId = p.Id,
                                Id = post.Id,
                                Message = post.Message,
                                PostedByLearnerId = post.PostedByLearnerId,
                                InsertedUTC = post.InsertedUTC,
                            };

        Store(x => x.DiscussionTopicPostsId, FieldStorage.Yes);
        Store(x => x.Id, FieldStorage.Yes);
        Store(x => x.Message, FieldStorage.Yes);
        Store(x => x.PostedByLearnerId, FieldStorage.Yes);
        Store(x => x.InsertedUTC, FieldStorage.Yes);

        Sort(x => x.Id, SortOptions.Int);
    }
}

请注意,Map有另一个from语句,该语句向下钻取到Posts文档上名为DiscussionTopicPosts的嵌套属性。