Запрос RavenDB с проекцией с родительской и последней дочерней записью для определенного диапазона дат - PullRequest
0 голосов
/ 22 февраля 2019

Допустим, у меня есть сообщение и коллекция комментариев,

public class Post {
 String title;
 List<Comment> comments;
}
public class Comment {
 Date date;
 String author;
 String comment;
}

Я бы хотел знать для определенного заголовка сообщения, что является самым последним комментарием в конкретном диапазоне дат.Результат будет представлен в виде проекции со следующей структурой:

public class Result {
 String postTitle;
 Date commentDate
 String commentAuthor;
 String comment;
}

Я изо всех сил пытаюсь заставить это работать, я пробовал несколько подходов, но не смог сделать это правильно.У меня есть индекс для этого, но я не совсем уверен, как я могу получить только последнюю запись дочернего элемента.Я получаю все записи в диапазоне дат, а не только последнюю запись.

Это мой индекс:

public Posts_LastCommentDateRange() {
    map = "docs.Posts.SelectMany(post => post.comments, (post, comment) => new {" +
        "    post.title," +
        "    commentDate = comment.date," +
        "    commentAuthor = comment.author," +
        "    comment.comment" +
        "})";   
}

Это мой запрос:

List<Result> res = session.query( Result.class, Posts_LastCommentDateRange.class )          
          .whereEquals( "title", "RavenDB Date Range" )   
          .whereBetween( "commentDate", "2019-01-02T10:27:18.7970000Z", "2019-01-25T15:01:23.8750000Z" )
          .selectFields( Result.class )
          .toList();

Любая помощь или направление будет высоко ценится.

Спасибо

1 Ответ

0 голосов
/ 01 апреля 2019

Вместо того, чтобы сохранять один результат для каждого сообщения + комментарий, вы можете использовать индекс для вывода только последнего комментария к сообщениям с помощью метода linq Max.

map = docs.Posts.Select(post =>
                 {
                     var latestComment = post.comments.Max(a => a.date);
                     return new {
                                  title = post.title,
                                  commentDate = latestComment.date,
                                  commentAuthor = latestComment.author,
                                  comment = latestComment.comment
                                 };
                }); 

Таким образом, ваш индекс в основном перебирает ваши сообщенияи вывод записи, которая содержит только последний комментарий.Тогда вашему запросу не придется проверять комментарии, которые определенно не самые последние.

...