Dapper Dynamic QueryMultiple

时间:2017-03-15 04:21:31

标签: c# sql dapper

我想查询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;
            }
        }
    }

1 个答案:

答案 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