質問: Dapperでクエリを実行してレコードのブロックのみを取得する場合は、.Skip()を使用できますか?Take()を使用するか、SQLで上位n *を使用する必要がありますか? たとえば、10,000レコードのテーブルが与えられ、リストページは200ページしか表示されないため、最初の200ページが必要です。私はこれを実行するのですか? ``` conn.Query("select * from Widgets").Skip((page - 1) * size).Take(size); ``` またはこれ: ``` conn.Query("select top 200 * from Widgets"); ``` Dapperの`.Query`メソッドが延期されているかどうか
回答: `SELECT TOP n...`使用してください。 `Query`メソッドには、オプションのパラメータ`bool buffered = true`があり`bool buffered = true` 。これは、trueが完全な結果セットをループして、各行を`List`に読み込みます。このパラメータはfalseにすることができます。結果の`IEnumerable`は、使用するまでdbクエリが実行されず、db側から1行ずつ取得されるという意味で「遅延」されます"(各反復で`IDataReader.Read`を呼び出します)。 だから、それは "延期"することができます。ただし、最初のn行のみをクライアントに転送することもできますが、DB側で10000レコードの結果セットを実行して準備するため、 `TOP n`使用する必要があります。