2012-03-21 33 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