2012-03-21 58 views
2

我有一個列表Parent對象列表的Children對象。我需要編寫一個查詢,讓我擁有最多孩子的父母。 ORM是實體框架,所以它應該與此一起工作。LINQ獲得大多數孩子的父母

代碼入手:

parents.FirstOrDefault(c => c.Children.Max()); 

類似的東西。

回答

5

我認爲它應該看起來更像是這樣的:

parents.OrderByDescending(p => p.Children.Count()).FirstOrDefault(); 

您的查詢是不正確的,因爲c.Children.Max()將嘗試遍歷一個父母的子女,如果他們支持的比較(如兒童是個整數),將簡單地返回其中最大的一個。而最有可能你的孩子對象不會BOOL,所以你將不能夠連編譯代碼,因爲FirstOrDefault需要

Expression<T, bool> 
1

你不需要分揀此:

int maxChildCount = parents.Max(x => x.Children.Count()); 
var maxParent = parents.FirstOrDefault(p => p.Children.Count() == maxChildCount); 

或者作爲查詢表達式:

var maxParent = (from p in parents 
       let max = parents.Max(x => x.Children.Count()) 
       where p.Children.Count() == max).FirstOrDefault(); 
+0

這不是要訪問每個記錄兩次嗎?這可能會比順序花費更長的時間嗎? – 2012-03-21 17:44:38

+0

是的 - 它將不得不遍歷兩次,因此它是'O(2n)'='O(n)',其中排序是'O(n lg n)'。鑑於這是通過EF查詢提供程序完成的,儘管最有可能的是排序+ select top(1)在內部進行了優化,實際執行效果比它應該更好。 – BrokenGlass 2012-03-21 17:48:09

+0

@BrokenGlass所以Validmir的答案在內存和轉換爲存儲表達式時都更有效率? – 2012-03-21 19:13:02