【问题标题】:Dapper Dynamic QueryMultipleDapper Dynamic QueryMultiple
【发布时间】:2017-03-15 04:21:31
【问题描述】:

我想使用 dapper 查询 2 个表并返回 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;
            }
        }
    }

【问题讨论】:

    标签: c# sql dapper


    【解决方案1】:

    为什么不为每个返回表创建模型?例子

    代表“Hub”表的类

    public class Hub
        {
            public byte Hub_Id { get; set; }
            public string Hub_Name { get; set; }
            public bool Hub_IsEnabled { get; set; }
        }
    

    代表“Opco”表的类

    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; }
    
        }
    

    返回视图模型的简洁代码

     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 必须如下所示,字段的顺序必须与 类和 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
    

    【讨论】:

    • 感谢您的回复。我需要一些动态的东西。所以我不需要继续将构建推向生产。我可以从 JSON 文件中运行我的查询。
    • 嗨@Steveo,你找到结果了吗?我也在寻找这个选项
    猜你喜欢
    • 2013-09-17
    • 1970-01-01
    • 1970-01-01
    • 2013-06-04
    • 1970-01-01
    • 2018-02-15
    • 1970-01-01
    • 1970-01-01
    • 2014-12-26
    相关资源
    最近更新 更多