2011-08-22 41 views
2

我在ASP.NET中編寫一個簡單的論壇,該論壇位於C#中的實體框架數據庫之上。C#和LINQ:按嵌套查詢的值排序查詢

每個Topic對象都有一個導航屬性Posts指向一個Post對象的集合。每個Post對象都有一個屬性When,指示帖子何時製作。

Post.ParentTopic的類型。 Post.IdentifierTopic.IdentifierInt32。只有PostWhen財產; Topic沒有此類屬性。 Topic.ParentIdentifier引用的第三種Forum

我的問題是這樣的:我似乎無法找到一種方法來排序所有主題對象的最後發表在每個主題。我已經試過這樣:

var topics = from t in context.Topics 
      from p in a.Posts 
      where t.Parent.Identifier == forum.Identifier 
      orderby p.When descending 
      select t; 

但我得到複製Topic對象和分選通過最新發布時間降序不

然後我嘗試這樣做:

var topics = (from t in context.Topics 
       let lastPost = 
        (from p in context.Posts 
        where p.Parent.Identifier == a.Identifier 
        orderby p.When descending 
        select p).FirstOrDefault().When 
       where t.Parent.Identifier == forum.Identifier 
       orderby lastPost descending 
       select t).Distinct(); 

它消除了重複的問題,但仍然沒有排序。我甚至試過a suggestion from another question

var topics = (from t in context.Topics 
       let posts = context.Posts.Where(p => p.Parent.Identifier == t.Identifier) 
       let lastPost = posts.OrderByDescending(p => p.When).FirstOrDefault() 
       where t.Parent.Identifier == forum.Identifier 
       orderby lastPost.When descending 
       select t); 

不知道接下來要嘗試什麼;看起來這些更高級的LINQ表達式讓我難以置信。有任何想法嗎?

回答

4

這應該工作:

var topics = from t in context.Topics 
      where t.Parent.Identifier == forum.Identifier 
      let lastPost = t.Posts.OrderByDescending(p => p.When).First() 
      orderby lastPost.When descending 
      select t; 

(假設Topic始終的一個或多個Post

+0

完美的作品!只需將.First()更改爲.FirstOrDefault(),因爲它不是查詢中的最終調用。謝謝! – hydroiodic

+0

@Thomas - 很好的答案。 – Enigmativity