質問: id) .OrderBy(orderProperty).AsEnumerable().Skip(index).Take(length).ToList(); ``` 私の質問は、EnumerableとQueryableの拡張としてSkipとTakeを使用することの違いは何ですか。 そして、2つのケースの間でEFが異なるSQLを生成することにしたのはなぜですか。
回答: > `Enumerable`と`Queryable`拡張として`Skip`と`Take`を使用する違いは何`Queryable` > > `Skip`または`Take`を`IQueryable`を実装する型で呼び出すと、 `Queryable`拡張メソッドがバインドされ、基底のLinqプロバイダ(Linq-to-Entitiesなど)が`Skip`や`Take`を処理し、基になるデータプロバイダ(SQL文など)。プロバイダが実際にそれらを*サポート*しているのか、 *正しく*処理して*いるの*かは、実行時までわかりません。 あなたが実装する型にそれらを呼び出すと`IEnumerable` (ではない`IQueryable` )、 `Enumerable`拡張メソッドは、ちょうどによって生成されたインメモリのコレクションでコマンドを処理した、バインドされる`Queryable`クエリ。 > なぜ2つのケースの間でEFが異なるSQLを生成することにしたのですか? > > 2番目のケースでは、生成されるSQLクエリには、 `AsEnumerable()`を注入するまでコマンドが組み込まれています。それはEFプロバイダーが見るすべてです。その後、コマンドは`Enumerable`拡張メソッドにバインドされ、残りのコマンドはメモリ内で処理されます。 > これは、SELECT TOP(10)を使用するSQLを生成するように見えました。 > > 私はそれを非常に疑う。何が起こる*べきことは* SQLクエリは*すべての*レコードを返しますが、によって生成されたメモリ内のイテレータということである`Take`唯一の最初の10を返します。 SQL 2008データベースのSKIPとTAKEを正しく処理したい場合は、 この解決策を参照してください。