我认为对于dapper.query对象,有一个datareader,对于dapper.Execute对象,有一个ExectureNonQuery对象。如果我错了,请纠正我。
我们能否使用dapper处理返回多个表的数据集?
我认为对于dapper.query对象,有一个datareader,对于dapper.Execute对象,有一个ExectureNonQuery对象。如果我错了,请纠正我。
我们能否使用dapper处理返回多个表的数据集?
不,Dapper没有内置支持DataSet
的功能,这主要是因为它看起来大多数情况下都是冗余的,而且这也不是dapper的目标。但这并不意味着它不包括用于处理选择多个结果的查询的API;请参见QueryMultiple
:
using (var multi = conn.QueryMultiple(sql, args))
{
var ids = multi.Read<int>().ToList();
var customers = multi.Read<Customer>().ToList();
dynamic someOtherRow = multi.Read().Single();
int qty = someOtherRow.Quantity, price = someOtherRow.Price;
}
请注意,由于 IDataReader
等的性质,此 API 仅支持顺序读取 - 基本上,每个 Read
/ Read<T>
等都会依次映射到下一个结果网格。
我可能晚了一步,但这是我将 IDataReader
转换为 DataSet
的方法。当我们使用 ExecuteReaderAsync
方法时,Dapper
返回一个 IDataReader
。有关此添加的更多信息可以在这里和这里找到。
以下是我的尝试:
public async Task<DataSet> GetUserInformationOnUserId(int UserId)
{
var storedprocedure = "usp_getUserInformation";
var param = new DynamicParameters();
param.Add("@userId", UserId);
var list = await SqlMapper.ExecuteReaderAsync(_connectionFactory.GetEpaperDBConnection, storedprocedure, param, commandType: CommandType.StoredProcedure);
var dataset = ConvertDataReaderToDataSet(list);
return dataset;
}
ConvertDataReaderToDataSet
方法将接收IDataReader
,您可以使用此方法将IDataReader
转换为Dataset
:
public DataSet ConvertDataReaderToDataSet(IDataReader data)
{
DataSet ds = new DataSet();
int i = 0;
while (!data.IsClosed)
{
ds.Tables.Add("Table" + (i + 1));
ds.EnforceConstraints = false;
ds.Tables[i].Load(data);
i++;
}
return ds;
}