如何创建视图模型没有排序内存集合
问题描述:
我有一个视图模型(下)。如何创建视图模型没有排序内存集合
public class TopicsViewModel
{
public Topic Topic { get; set; }
public Reply LastReply { get; set; }
}
我想从我的IQueryable<Topic>
收集和IQueryable<Reply>
收集填充值的IQueryable<TopicsViewModel>
。我不想使用附加的实体集合(即Topic.Replies),因为我只想要该主题的最后一个回复,并执行Topic.Replies.Last()将整个实体集合加载到内存中,然后抓取最后一个名单。我试图留在IQueryable中,以便查询在数据库中执行。
我也不想通过主题进行foreach并查询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,以便它查询数据库并抓取主题和该主题的最后回复?我努力避免抓住与该主题相关的所有回复。我只想抓住最后的回复。
谢谢你的任何洞察力,你必须提供。
答
由于没有人回答我现在正在使用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>
,再通过最后的结果循环(以确保数据的,适当的寻呼循环之前完成)并在最后一个回复中加载。这似乎避免填充回复集合,而是仅抓取每个主题的最后一个回复。
答
from r in replies
group r by new { r.TopicId } into g
select new
{
TopicId = g.Key.TopicId,
LastReply = g.Max(p => p.PostedDate)
}
是否有主题和回复之间的导航属性? – 2011-01-13 22:23:00
是的,那是我提到的附属实体集合。但是,我不想访问该导航属性并触发整个集合的延迟加载。如果我需要该集合中的所有项目,那么这将是有道理的,但因为我只需要该集合中的最后一项,所以最好留在IQueryable中。 – Chev 2011-01-13 22:24:45
当你说'不工作'时,究竟哪个部分不工作?运行时异常,没有返回,或返回的一切..? – 2011-01-13 23:17:38