我正在执行存储过程,使用QueryMultiple
来返回多组数据。QueryMultiple Result Set Order Changed
var gridReader = db.QueryMultiple("sp",
parameters,
commandType: CommandType.StoredProcedure);
我可以很轻松地获得各组给予我知道订单,他们会回去。
SELECT * FROM dbo.Set1;
SELECT * FROM dbo.Set2;
SELECT * FROM dbo.Set3;
var set1 = gridReader.Read<Set1>();
var set2 = gridReader.Read<Set2>();
var set3 = gridReader.Read<Set3>();
不过,我在的情况下,他们的顺序会回来可能会改变。另一位开发人员可能因为任何原因决定更改订单。存储过程现在变为:
SELECT * FROM dbo.Set1;
SELECT * FROM dbo.Set3;
SELECT * FROM dbo.Set2;
我该如何处理?
我最初的尝试是迭代每个网格,检查列名称。这似乎起初运作良好,但我无法弄清楚如何将网格投影到课程中,除了手动设置每个字段。我使用Dapper的主要原因是它可以为我做到这一点。
while (true)
{
var grid = gridReader.Read();
IDictionary<string, object> row = grid.FirstOrDefault();
if (row == null)
break;
if (row.Keys.Contains("Set1_UniqueColumnName"))
{
// Need something like grid.Read<Set1>();
}
else if (row.Keys.Contains("Set2_UniqueColumnName")) { }
else if (row.Keys.Contains("Set3_UniqueColumnName")) { }
}
我的第二个想法是读每个网格成一个类,检查类的唯一字段空值/默认值,并试图在下次上课;如果测试失败。这显然不会工作。 .Read()
将返回下一个网格的结果。这个解决方案需要我能够一遍又一遍地读取同一个网格。
谢谢你指着我在正确的方向!我想我会需要'GetRowParser',但我无法弄清楚。将它与SqlDataReader结合起来就是个诀窍。 –
不客气:)干得好! – davmos