生成された部分クラスに次のようなメソッドがあります。
var pChildren = this.Children
.Skip(skipRelated)
.Take(takeRelated)
.ToList();
SQL Serverを見ると、生成されたコードが実行していることがわかります。SELECT *.* FROM Children
このコードはクラスから直接取得され、Skip/Takeの順序が.ToListの前であることを確認しました。
.ToListを削除すると、その行は高速になります(そして、SQLはDBに送信されません)がforeach
、結果を確認しようとすると、同じSQLがDBに送信されますSELECT *.* FROM Children
。
.Skipと.Takeを使用するときに、エンティティのナビゲーションプロパティを使用するときに特別なことをする必要がありますか?
アップデート
実際のSQLを生成しようとしますが、現在はそのように設定されていません。最初のものを見つけたのは、SSMSの「最近の高価なクエリ」リストに表示されているためです。
これを実行する:
var pChildren = this.Children
//.Skip(skipRelated)
//.Take(takeRelated)
.ToList();
〜4,000,000行を返し、〜25秒かかります。
これを実行する:
var pChildren = this.Children
//.Skip(skipRelated)
.Take(takeRelated)
.ToList();
〜4,000,000行を返し、〜25秒かかります。
私が言ったように、私はこれらのために生成されたSQLをつかみ、それらも提起します。