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



我们最近构建了一个名为TableMapperT的映射类,它封装了我们的Dapper multimap函数。 我们将其与我们的"命令"对象分开构建,称为 TableCommand,它保存 sql 文本信息等。然而,为了使用它,我们必须使用'QueryMultiple',这也是返回单个结果然后映射它所必需的。

我们已经运行了基本的性能指标,性能似乎等于常规的查询 api(使用相同的多映射循环访问相同的查询,但使用 'Read((' 使用 QueryMulti。

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

Sam Saffron 指出,这篇文章中没有缓冲结果(Dapper.NET 并存储了具有多个结果集的过程(,但那是一段时间前的事情,源代码看起来像"缓冲"现在是真的(公共 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>

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

关于缓冲:

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

最新更新