2012-03-21 14 views
2

私はのリストを持っていて、リストはChildrenです。私はほとんどの子供がいる親を与えるクエリを書く必要があります。 ORMはエンティティのフレームワークなので、それはうまくいくはずです。LINQはほとんどの子を持つ親を取得します

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

そのような何かを:で開始する

コード。

答えて

5

私はそれがより次のようになりますと思う:

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

c.Children.Max()は1つの親の子を反復しようとすると、彼らは比較をサポートしている場合(例えば子供がint型です)ので、あなたのクエリは、正しくありません、単に最大のものを返すでしょう。

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

または:FirstOrDefaultあなたはこのためにソートする必要はありません

Expression<T, bool> 
1

がかかるので、あなたが、でも、コードをコンパイルすることができませんので、最もおそらくあなたの子供のオブジェクトは、BOOLされていませんクエリ式として

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

これは各レコードを2回訪問するのではありませんか?それは注文よりも長くかかりますか? –

+0

はい - ソートが 'O(n lg n)'の場合、 'O(2n)' = 'O(n)'ですので、2回横断する必要があります。これはEFクエリプロバイダで行われることを前提としていますが、ソート+ select top(1)は内部的に最適化されているため、実際よりも優れた性能を発揮します。 – BrokenGlass

+0

@BrokenGlass Validmirの答えは、メモリ内とストアド式に変換されたときの両方でより効率的ですか? –

関連する問題