2012-03-21 5 views
2

У меня есть список Parent объектов, имеющих список Children объектов. Мне нужно написать запрос, который даст мне родителя, у которого больше всего детей. ORM - это структура сущности, поэтому она должна работать с этим.LINQ get parent with most children

код начинать с:

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

Что-то в этом роде.

ответ

5

Я думаю, что это должно выглядеть следующим образом:

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

Ваш запрос не является правильным, потому что c.Children.Max() попытается перебрать детей одного из родителей, и если они поддерживают сравнение (например, дети Ints), просто вернут большинство из них. И, скорее всего, ваши объекты Дети не BOOL, так что вы не сможете даже скомпилировать код, потому что FirstOrDefault принимает

Expression<T, bool> 
1

Вам не нужно сортировать для этого:

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

Or как выражение запроса:

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

Разве это не будет посещать каждую запись дважды? Может, это займет больше времени, чем порядок? –

+0

Да - ему придется проходить дважды, так что это 'O (2n)' = 'O (n)', где сортировка - «O (n lg n)». Учитывая, что это делается по поставщику запросов EF, хотя наиболее вероятно, что сортировка + select top (1) оптимизирована внутри, чтобы фактически работать лучше, чем нужно. – BrokenGlass

+0

@BrokenGlass, поэтому ответ Validmir более эффективен как в памяти, так и при преобразовании в сохраненное выражение? –

Смежные вопросы