如何创建视图模型而不在内存中排序集合

时间:2011-01-13 22:04:25

标签: c# linq entity-framework linq-to-entities

我有一个视图模型(如下)。

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中,以便在数据库中执行查询。

我也不想通过主题和查询replyRepository.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 个答案:

答案 0 :(得分:1)

由于没有人回答我现在正在使用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>,然后循环查看最终结果(以确保在循环之前完成正确的数据分页)并在最后一个回复中加载。这似乎可以避免填写回复集合,而只是抓取每个主题的最后一个回复。

答案 1 :(得分:0)

        from r in replies
        group r by new { r.TopicId } into g
        select new
            {
                TopicId = g.Key.TopicId, 
                LastReply = g.Max(p => p.PostedDate)
            }