3

このメソッドを使用して、EF からデータの各ページを取得します。

public IEnumerable<MyObj> GetByPage(int page, int perPage)
{
    return context.MyObj.Skip((page - 1) * perPage).Take(perPage);
}

私は知りたいです;このコードはすべての行をフェッチMyObjしてメモリに保存し、上記のコードのすべてまたはすべてSkipTakeSQLコマンドに変換しますか?

すべてが最初にメモリに保存される場合、LINQ を使用してメモリを使用しないようにするにはどうすればよいSkipですTakeか?

4

4 に答える 4

7

クエリを実体化していない限り (つまり、ToList()/ToArray()などを呼び出したり、それを反復処理したり)、SkipandTakeメソッドは、Entity Framework の一部である Linq to Entities プロバイダーによって SQL に変換されます。

あなたの質問に答えるには:いいえ、すべてのデータを取得してメモリにロードするわけではありません。

完全な説明については、この MSDN の記事を参照してください。

于 2013-09-09T17:02:33.517 に答える
3

Skipとの両方がLINQ to Entities でサポートされているメソッドTakeとしてリストされているため、これらは適切な SQL ステートメントに変換され、必要な行のみがデータベースから取得されます。

また、そのメソッドから返されるクエリへIEnumerable<T>のすべての呼び出しではなく、メソッドが返さIQueryable<T>れるため、クエリが実行されます。

于 2013-09-09T17:02:36.660 に答える
2

Skip評価さTakeれ、結果がメモリに保存されるため、データセット全体がメモリに保持されるわけではありません。これは遅延実行と呼ばれます。

于 2013-09-09T17:03:16.663 に答える