在 Petapoco 或 Dapper 中处理不同数量的结果集?
Handling varying number of result sets in Petapoco or Dapper?
我以前使用 QueryMultiple
处理多个结果集,但我知道返回的结果集的确切数量。在这种情况下,当我使用 QueryMultiple
调用存储过程时,返回的结果集数量会发生变化。是否可以在 PetaPoco 或其他 orm(例如 Dapper)中处理此问题?
Dapper 的QueryMultiple
方法returns一个GridReader
; GridReader
有一个 .IsConsumed
属性,当您阅读了所有可用的结果集后,它应该更改为 true
,这样可能会起作用:
using(var reader = conn.QueryMultiple(...)) {
do {
var data = reader.Read<...>().AsList();
// ...
} while(!reader.IsConsumed);
}
或者,Dapper 有一个只执行 "pack the parameters and invoke step" 的 ExecuteReader
方法和一个只公开 "materialize a row into an object" 代码的 GetTypeDeserializer
方法,因此您可以手动组合那些,即:
using(var reader = conn.ExecuteReader(...)) {
do {
var parser = SqlMapper.GetTypeDeserializer(...);
while(reader.Read()) {
var obj = parser(reader);
// ...
}
} while(reader.NextResult());
}
(我对petapoco了解不多,sorry)
我以前使用 QueryMultiple
处理多个结果集,但我知道返回的结果集的确切数量。在这种情况下,当我使用 QueryMultiple
调用存储过程时,返回的结果集数量会发生变化。是否可以在 PetaPoco 或其他 orm(例如 Dapper)中处理此问题?
Dapper 的QueryMultiple
方法returns一个GridReader
; GridReader
有一个 .IsConsumed
属性,当您阅读了所有可用的结果集后,它应该更改为 true
,这样可能会起作用:
using(var reader = conn.QueryMultiple(...)) {
do {
var data = reader.Read<...>().AsList();
// ...
} while(!reader.IsConsumed);
}
或者,Dapper 有一个只执行 "pack the parameters and invoke step" 的 ExecuteReader
方法和一个只公开 "materialize a row into an object" 代码的 GetTypeDeserializer
方法,因此您可以手动组合那些,即:
using(var reader = conn.ExecuteReader(...)) {
do {
var parser = SqlMapper.GetTypeDeserializer(...);
while(reader.Read()) {
var obj = parser(reader);
// ...
}
} while(reader.NextResult());
}
(我对petapoco了解不多,sorry)