mvc에서 dapper를 사용하여 동적 결과

asp.net-core asp.net-mvc c# dapper

문제

나는 아래의 방법으로 동적 인 결과를 dapper와 stored procedure를 사용하여 리턴하려고 노력하고있다. 올바른 방법으로하고 있습니까?

using (IDbConnection dbConnection = Connection)
{
    dbConnection.Open();

    var result = dbConnection.Query<dynamic>("LMSSP_GetSelectedTableData",
        new
        {
            TableName = TableName,
            LangaugeID = AppTenant.SelectedLanguageID,
            UserID = AppTenant.UserID
        }, commandType: CommandType.StoredProcedure).ToList();


    if (result != null)
    {
        // Added just for checking the data
        foreach (var item in (IDictionary<string, object>)result.FirstOrDefault())
        {
            string key = item.Key;
            string value = item.Value.ToString();

        }
    }
}

내 저장 프로 시저가 무엇인지, 내가 어떤 테이블 이름을 전달하고 그 결과 / 레코드를 반환합니다. 그래서, 분명히 레코드의 숫자, 열은 전달 된 테이블 이름에 따라 달라질 것입니다.

이것을 달성하기 위해 나는 dapper와 함께 동적 인 키워드를 사용했다.

그래서 내 질문은 모델로보기 위해이 데이터를 전달하고 속성 / 열 데이터 형식에 따라보기에서 컨트롤을 렌더링 할 수 있습니다. 열 또는 PropertyInfo의 데이터 형식을 가져올 수 있습니까?

하지만, dapper가 데이터베이스에서 레코드를 가져올 때 그것은 dapper 행 유형으로 반환됩니까?

수락 된 답변

동일한 SP를 사용하여 다른 테이블에서 데이터를 가져 오는 것은 혼란 스럽습니다 (좋은 디자인이 아님). 그러나 기술적으로 문제를 해결하려면 제어 정보 목록이있는 모델을 만들 수 있습니다. 제어 정보의 예

public class ControlInformation
{
    public string Name { get; set; }

    public dynamic Value { get; set; }

    public string ControlType { get; set; }

    // Applicable for drop down or multi select
    public string AllValues { get; set; }
}

모델에는 ControlInformations 목록이 있습니다.

public List<ControlInformation> ControlInformations { get; set; }

뷰는 컨트롤을 렌더링합니다 (컨트롤 유형에 기반한 부분 뷰). 예 : int의 다른 뷰와 나머지 뷰를 렌더링하는 아주 기본적인 경우. 나는 "IntCtrl"과 "StringCtrl"2 부분보기 있습니다.

@foreach (var item in Model.ControlInformations)
    {
        if (@item.ControlType == "System.Int32")
        {
            Html.RenderPartial("IntCtrl", item);
        }
        else
        {
            Html.RenderPartial("StringCtrl", item);
        }
    }

희망이 도움이됩니다.


인기 답변

여기에 Datatable을 반환하는 메서드를 호출합니다.

    public DataTable GetMTDReport(bool isDepot, int userId)
    {
        using (IDbConnection _connection = DapperConnection)
        {
            var parameters = new DynamicParameters();
            parameters.Add("@IsDepot", isDepot);
            parameters.Add("@userId", userId);
            var res = this.ExecuteSP<dynamic>(SPNames.SSP_MTDReport, parameters);
            return ToDataTable(res);
        }
    }

이 과정에서 우리는 사용자 정의 메서드 "ExecuteSP"를 호출하여 저장 프로 시저를 호출 할 수 있습니다.

    public virtual IEnumerable<TEntity> ExecuteSP<TEntity>(string spName, object parameters = null)
    {
        using (IDbConnection _connection = DapperConnection)
        {
            _connection.Open();
            return _connection.Query<TEntity>(spName, parameters, commandTimeout:0 , commandType: CommandType.StoredProcedure);
        }
    }

여기에 데이터베이스를 연결하는 "DapperConnection"메소드가 있습니다 : [ "MainConnection"] 키를 사용하여 연결 문자열을 지정할 수 있습니다

public class DataConnection
{
    public IDbConnection DapperConnection
    {
        get
        {
            return new SqlConnection(ConfigurationManager.ConnectionStrings["MainConnection"].ToString());
        }
    }
}

그리고 마지막으로 우리는 "ToDataTable"메서드를 호출하여 데이터 테이블에서 응답을 변경합니다. 우리는 저장 프로 시저에 동적 유형을 전달 했으므로 데이터베이스에서 DapperRow의 응답을 받게됩니다.

    public DataTable ToDataTable(IEnumerable<dynamic> items)
    {
        if (items == null) return null;
        var data = items.ToArray();
        if (data.Length == 0) return null;

        var dt = new DataTable();
        foreach (var pair in ((IDictionary<string, object>)data[0]))
        {
            dt.Columns.Add(pair.Key, (pair.Value ?? string.Empty).GetType());
        }
        foreach (var d in data)
        {
            dt.Rows.Add(((IDictionary<string, object>)d).Values.ToArray());
        }
        return dt;
    } 


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