2016-05-04 11 views
0

次のクエリが8つの船舶のリストを返す理由を説明できますか?私は、クエリからInclude(m => m.VesselAddresses.Select(c => c.Address))またはOrderByを削除する場合Entity Framework Take()がより多くの要素を返します

var vessels = await db.Vessels 
         .Include(m => m.Images.Select(c => c.Activity)) 
         .Include(m => m.VesselAddresses.Select(c => c.Address)) 
         .Where(m => m.Images.Any(c => c.Activity.Active)) 
         .Where(m => m.Activity.Active) 
         .Where(m => m.Listed) 
         .Where(m => m.Activity.User.Active) 
         .OrderBy(m => Guid.NewGuid()) 
         .Take(4) 
         .ToListAsync(); 

、それだけで正常に動作し、4つのレコードを返しますが、それがあるとして、私はそれを残す場合は、それも私が指定した、8つのレコードを返すTake(4)

EDIT

これは、ほとんどのアパートテーブルの同じクエリですが、このクエリがうまく動作し、常に4行が返されます。

var apartments = await db.Apartments 
         .Include(m => m.Images.Select(c => c.Activity)) 
         .Include(m => m.Address) 
         .Where(m => m.Images.Any(c => c.Activity.Active)) 
         .Where(m => m.Activity.Active) 
         .Where(m => m.Listed) 
         .Where(m => m.Activity.User.Active).OrderBy(m => Guid.NewGuid()) 
         .Take(4) 
         .ToListAsync(); 
+0

この回答を見ることができます:http://stackoverflow.com/a/12065589/4550393。 「foreachまたはToList()が完了するまで、linq-To-Entitiesクエリは実際にデータベースへのラウンドトリップを行いません」というステートメントがあります。これはヒントを与えるかもしれない。 – Norman

答えて

0

エンティティフレームワークは、ToListAsyncを呼び出すまで作成しているクエリを実行しないため、インクルードはSQLに変換できないため、SQLを実行するまでクエリビルダによって無視されます。 takeTOPとしてSQLに変換するため、インクルードが含まれていることを意味するが.Takeを移動Take

後に適用されている(4).ToListAsync後()も

を修正する必要が私はあなたが.OrderBy(Mを使用していると仮定=> Guid.NewGuid())私は代わりに示唆する結果をランダム化するRandom.NextDouble() guidはランダム化のために過剰です

+0

解決策として何をお勧めしますか? Take(4)の代わりにTake(2)を置くと、私は望みの効果が得られますが、コードはミスリーディングに見えます。 また、私はほぼ同じクエリを持つアパートメントテーブルを持っており、うまく動作します。 私はその情報で質問を更新します。 – Robert

+0

ToListAsync()のオーバーキルの後にTake(4)を移動せず、数千のレコードを4つではなくメモリにフェッチしますか? – Robert

関連する問題