DapperのIEnumerableを実行するかどうか延期または即時実行を行っていますか?

c# dapper deferred-execution ienumerable orm

質問

Dapperでクエリを実行してレコードのブロックのみを取得する場合は、.Skip()を使用できますか?Take()を使用するか、SQLで上位n *を使用する必要がありますか?

たとえば、10,000レコードのテーブルが与えられ、リストページは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>メソッドが延期されているかどうか

受け入れられた回答

SELECT TOP n...使用してください。

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

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



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ