使用MVC短小精悍的动态结果

问题描述 投票:2回答:2

我想下面的方式返回采用短小精悍和存储过程的动态结果。我做它正确的方式?

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();

        }
    }
}

什么我的存储过程做的是,我会把所有的表名和基于这样它会返回结果/ records.So,显然我的记录数,列将被改变为每个传递的表名。

要做到这一点我与短小精悍一起使用动态关键字。

所以我的问题是我如何可以通过这些数据来查看的建模和渲染的控件在视图上按属性/列的数据类型。我可以列或的PropertyInfo的数据类型?

但是,当从短小精悍的数据库中检索记录,它返回为短小精悍的行类型?

c# asp.net-mvc asp.net-core dapper
2个回答
3
投票

使用相同的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和休息另一个视图不同视图。我有2条部分的意见“INTCTRL”和“StringCtrl”。

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

希望这有助于。


0
投票

在这里,我们调用方法,它返回的数据表:

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

而在最后,我们称之为“数据表”的方法来改变我们在数据表响应。因为我们通过在存储过程中的动态类型,我们将在收到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;
    } 
© www.soinside.com 2019 - 2024. All rights reserved.