Как создать модель представления без сортировки коллекций в памяти - PullRequest
1 голос
/ 14 января 2011

У меня есть вид модели (ниже).

public class TopicsViewModel
{
    public Topic Topic { get; set; }
    public Reply LastReply { get; set; }
}

Я хочу заполнить IQueryable<TopicsViewModel> значениями из моей коллекции IQueryable<Topic> и IQueryable<Reply>. Я не хочу использовать присоединенную коллекцию сущностей (т.е. Topic.Replies), потому что мне нужен только последний ответ для этой темы и выполнение Topic.Replies.Last () загружает всю коллекцию сущностей в память, а затем захватывает последнюю в список. Я пытаюсь остаться в IQueryable, чтобы запрос выполнялся в базе данных.

Я также не хочу разбираться в темах и запрашивать responseRepository.Replies, поскольку циклическое выполнение IQueryable<Topic> запускает отложенную загрузку. Я бы предпочел построить одно выражение и сделать всю работу ног на нижних уровнях.

У меня есть следующее:

IQueryable<TopicsViewModel> topicsViewModel = from x in topicRepository.Topics
                                              from y in replyRepository.Replies
                                              where y.TopicID == x.TopicID
                                              orderby y.PostedDate ascending
                                              select new TopicsViewModel { Topic = x, LastReply = y };

Но это не работает. Любые идеи, как я могу заполнить IQueryable или IEnumerable TopicsViewModel так, чтобы он запрашивал базу данных и захватывал темы и последний ответ этой темы? Я очень стараюсь, чтобы не получить все ответы, связанные с этой темой. Я только хочу получить последний ответ.

Спасибо за любые идеи, которые вы можете предложить.

Ответы [ 2 ]

1 голос
/ 14 января 2011

Так как никто не отвечает, я иду сейчас к решению foreach.Я полагаю, что прохождение по темам, которые в конечном итоге будут загружаться лениво в любом случае, гораздо лучше, чем заполнение набора ответов, просто чтобы я мог получить доступ к последнему объекту в коллекции.

Вот что я сделал сейчас:

                List<TopicsViewModel> topicsViewModelList = new List<TopicsViewModel>();
                foreach (Topic topic in topics)
                {
                    Reply lastReply = replyRepository.GetRepliesBy_TopicID(topic.TopicID).OrderBy(x => x.PostedDate).LastOrDefault();

                    topicsViewModelList.Add(new TopicsViewModel
                    {
                        Topic = topic,
                        LastReply = lastReply
                    });
                }

Сначала я загружаю IQueryable<Topics>, затем перебираю окончательные результаты (чтобы обеспечить правильную подкачку данных перед циклом) и загружаю последний ответ.Похоже, что это никогда не заполняет коллекцию ответов, а вместо этого захватывает только последний ответ для каждой темы.

0 голосов
/ 14 января 2011
        from r in replies
        group r by new { r.TopicId } into g
        select new
            {
                TopicId = g.Key.TopicId, 
                LastReply = g.Max(p => p.PostedDate)
            }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...