9

Dapper でクエリを実行し、レコードのブロックのみを取得したい場合、.Skip().Take() を使用できますか、それとも SQL で select top n * を使用する必要がありますか?

たとえば、10,000 件のレコードを含むテーブルがあり、リスト ページには 1 ページあたり 200 件しか表示されないため、最初の 200 件のみが必要です。これを実行しますか?

conn.Query<Widget>("select * from Widgets").Skip((page - 1) * size).Take(size);

またはこれ:

conn.Query<Widget>("select top 200 * from Widgets");

Dapperの.Query<T>メソッドは延期されていますか?

4

1 に答える 1

11

を使用する必要がありますSELECT TOP n...

このQuery<T>メソッドにはオプションのパラメーターbool buffered = trueがあり、 true の場合、結果セット全体をループし、各行をList<T>. このパラメーターを false にすることができます。その結果、IEnumerable<T>使用するまで db クエリが実行されず、db 側から行が「一度に 1 つずつ」取得されるという意味で「延期」されます (IDataReader.Read上の呼び出し各反復)。

ですから、はい、それは「延期」することができます。TOP nただし、そうしないと db 側で 10000 レコードの結果セットを実行して準備するため、引き続き使用する必要がありますが、それらの最初の n 行のみをクライアントに転送できます。

于 2013-10-19T00:47:43.467 に答える