2013-12-09 43 views
0

首先,我遇到了Entity Framework 5代碼的排序問題。我創建了一個不大不小的論壇,有兩個班在我的模型:EF按項目屬性或子項屬性進行排序取決於具體情況

  • 消息(的MessageId,DatePost,標題,內容)
  • 評論(CommentId,DatePost,內容的MessageId)

消息有一個名爲Comments的導航集合,EF Code First和相關配置可以很好地處理它。

在論壇的主頁中,我試圖通過他們的最後評論日期排序消息,以便將最後評論的消息放在最前面。我寫了這樣的代碼:

_messageRepository 
      .GetAll() 
      .OrderByDescending(m => m.Comments.Max(c => c.DatePost)) 
      .ToList(); 

問題是,當我發佈新消息時,它沒有評論,所以它在頁面的底部。我想結合最後的排序方法與.OrderByDescending(m => m.Datepost)我以前不適合我的需求了...

任何幫助嗎? :-)

謝謝!

回答

0

井LINQ到對象,你只想做:

_messageRepository 
      .GetAll() 
      .OrderByDescending(m => m.Comments.Any() 
            ? m.Comments.Max(c => c.DatePost) 
            : m.Datepost) 
      .ToList(); 

但是EF可能無法翻譯,爲SQL。你可以實現物品清單,然後致電.OrderBy

_messageRepository 
      .GetAll() 
      .AsEnumerable() 
      .OrderByDescending(m => m.Comments.Any() 
            ? m.Comments.Max(c => c.DatePost) 
            : m.Datepost) 
      .ToList(); 
+1

我不會考慮實現列表解決方案.. – Moeri

+0

我相信第一個查詢可以在EF中工作而無需實現解決方案(它至少與我正在使用的類似數據集一樣)。 – Ocelot20

+0

@Moeri無論如何都通過'ToList()'來實現 - 它只是在客戶端而不是SQL中進行排序。 –

1

這個怎麼樣?

_messageRepository 
    .GetAll() 
    .OrderByDescending(m => m.Comments.Max(c => (DateTime?)c.DatePost) 
     ?? m.Datepost) 
    .ToList(); 
+0

這對我有用,謝謝!我終於選擇了斯坦利的解決方案,我更喜歡沒有日期時間? cast –