我想查询2个表并使用dapper返回2个结果集。
这是我正在尝试的代码。
此代码构建但QueryMultiple看起来无法获取第二个结果集或其他内容。我已经尝试循环结果并使用动态的.Read()。
您认为它无法正常工作,因为我正在尝试将2种不同大小的表添加到单个动态列表中吗?
public virtual IEnumerable<dynamic> QueryDatabase(Report report)
{
if (report == null) return null;
using (var conn = new SqlConnection(this.configurationHelper.GetConnectionStringByName(report.ConnectionName)))
{
conn.Open();
var sql = report.Query;
//var results = conn.QueryMultiple(sql).Read<dynamic>();
using (var multi = conn.QueryMultiple(sql))
{
var result = new List<dynamic>();
foreach (var item in multi.Read())
{
result.Add(item);
}
return result;
}
}
}
答案 0 :(得分:1)
为什么不为每个返回表创建模型?例子
代表&#34; Hub&#34;表
public class Hub
{
public byte Hub_Id { get; set; }
public string Hub_Name { get; set; }
public bool Hub_IsEnabled { get; set; }
}
代表&#34; Opco&#34;表
public class Opco
{
public string Opco_Id { get; set; }
public string Opco_Country { get; set; }
public byte Opco_Hub_Id { get; set; }
public bool Opco_IsEnabled { get; set; }
}
表示ViewModel的ViewModel
public class ReportViewModel
{
public List<Opco> OpcoList { get; set; }
public List<Hub> HubList { get; set; }
}
用于返回视图Model
的dapper代码
string connString = Utility.Common.GetConnectionString();
public ReportViewModel GetReportViewModel()
{
ReportViewModel reportViewModel = new ReportViewModel();
using (var conn = new SqlConnection(connString))
{
conn.Open();
using (var multi =
conn.QueryMultiple("GetReportViewModel", null, null,
commandTimeout: 0,
commandType: CommandType.StoredProcedure))
{
reportViewModel.HubList = multi.Read<Hub>().ToList();
reportViewModel.OpcoList = multi.Read<Opco>().ToList();
}
}
return reportViewModel;
}
SP必须如下所示,字段必须与 我的意思是,class和SELECT必须是ViewModel的顺序 首先选择集线器,然后选择Opcos。
ALTER PROCEDURE [dbo].[GetReportViewModel]
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
SELECT
Hub_Id,
Hub_Name
FROM [dbo].[Tbl_Hubs]
WHERE [Hub_IsEnabled] = 1;
SELECT
OpCo_Id,
OpCo_Country
FROM [dbo].[Tbl_OpCos]
WHERE [OpCo_IsEnabled] = 1;
END