Dapper Dynamic QueryMultiple

c# dapper sql

문제

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

인기 답변

왜 돌아 오는 테이블마다 모델을 만들지 않겠습니까? 예

"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


아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.