Dapper-dot-Netの "Query"と "QueryMultiple"は、結果セットを返すときのパフォーマンスと動作が同じですか?

dapper

質問

私たちは最近、Dapperマルチマップ関数をカプセル化するTableMapperTと呼ばれるマッピングクラスを構築しました。 TableCommandと呼ばれるSQL文の情報などを保持する 'command'オブジェクトとは別に、これを作成します。しかし、それを使用するには、単一の結果を返してからそれをマッピングするために必要な 'QueryMultiple'を使用する必要があります。

基本的なパフォーマンスメトリックを実行し、パフォーマンスは通常のQuery apiと同じに見えます(同じマルチマップで同じクエリをループしますが、 'Read()'を使用してQueryMultipleを使用します)。

つまり、単一のレコードセットに対してQueryMultipleを使用する際のパフォーマンスや動作には基本的な欠点がありますか?そこにはないようだが、コミュニティ全体がより大きな洞察力を持っているかもしれないと思った。

Sam Saffronは、この記事では結果がバッファリングされていないことを示しています( Dapper.NETと複数の結果セットを持つprocを格納しています )。しかし、それはしばらく前からあり、 'buffered'のようなソースコードが現実になります(public IEnumerable Read =真)。

使用法(以下)は非常にきれいで、IDatabaseオブジェクトの「クエリ」拡張メソッドである1つの場所で接続とエラー処理を扱うことができます。

var command = new TableCommand(<SQL>,<Parameters>,<Timeout>);
var mapper = new TableMapper<OrderLineItem>();  //return type here
mapper.SetMap<OrderLineItem,Product>((oli,p)=>{oli.Product = p;return oli}); //input types here

return this.Database.Query(command,mapper);//returns IEnumerable<OrderLineItem>

受け入れられた回答

ここでの問題はパフォーマンスではなく、利便性です。ほとんどのクエリIMOは単一の結果グリッドです。複数のグリッド・リーダ・シナリオの追加的な複雑さを混乱させることがないようにすると便利です。各グリッドは異なる形状にすることができ、特定の順序でしか読み取ることができないため、必然的に複雑です。

バッファリングについて:

  • 完全にストリーミングするためにオフにすることはできますが、デフォルトではグリッドの Read<T> / Query<T>バッファ読み込みます
  • しかし、マルチグリッドAPIの後続のグリッドは要求れたときにのみアクセスされるため、マルチグリッドAPIを順番に使用する必要があります


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