2011-01-13 70 views
1

我有一個視圖模型(下)。如何創建視圖模型沒有排序內存集合

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,以便它查詢數據庫並抓取主題和該主題的最後回覆?我努力避免抓住與該主題相關的所有回覆。我只想抓住最後的回覆。

謝謝你的任何洞察力,你必須提供。

+0

是否有主題和回覆之間的導航屬性? – 2011-01-13 22:23:00

+0

是的,那是我提到的附屬實體集合。但是,我不想訪問該導航屬性並觸發整個集合的延遲加載。如果我需要該集合中的所有項目,那麼這將是有道理的,但因爲我只需要該集合中的最後一項,所以最好留在IQueryable中。 – Chev 2011-01-13 22:24:45

+0

當你說'不工作'時,究竟哪個部分不工作?運行時異常,沒有返回,或返回的一切..? – 2011-01-13 23:17:38

回答

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>,再通過最後的結果循環(以確保數據的,適當的尋呼循環之前完成)並在最後一個回覆中加載。這似乎避免填充回覆集合,而是僅抓取每個主題的最後一個回覆。

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) 
      }