返回一个结果集时,Dapper-dot-Net的“Query”和“QueryMultiple”在性能和行为上是否相等?

时间:2013-10-07 20:00:08

标签: dapper

我们最近构建了一个名为TableMapperT的映射类,它封装了我们的Dapper multimap func。我们从名为TableCommand的'command'对象中单独构建它,它包含sql文本信息等。但是为了使用它,我们必须使用'QueryMultiple',它也是返回单个结果然后映射它所必需的。

我们已经运行了基本的性能指标,其性能似乎与常规的查询API相同(使用相同的多重映射循环同一个查询,但使用'Read()'查询多个查询。

所以问题是,对于单个记录集使用QueryMultiple时,性能或行为是否存在根本缺点?似乎没有,但认为整个社区可能有更大的洞察力。

Sam Saffron表示结果未在此帖子中缓存(Dapper.NET and stored proc with multiple result sets),但这是前一段时间,源代码看起来像'buffered'现在是真的(公共IEnumerable Read(bool buffered = true) )。

用法(下面)非常干净,允许我们在IDatabase对象上的“查询”扩展方法的一个位置纠缠连接和错误处理。

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>

1 个答案:

答案 0 :(得分:3)

这里的问题不是表现,而是方便。大多数查询,IMO,是单个结果网格。更方便的是不必混淆多个网格阅读器场景的额外复杂性,这必然更复杂,因为每个网格可以是不同的形状,并且它们只能以特定顺序读取。

关注缓冲:

    默认情况下,
  • Read<T> / Query<T>缓冲区该网格,但可以关闭以完全流式传输
  • 但是:多网格API中的后续网格只能在请求时访问 - 因此需要依次使用多网格API