C# 在mvc中使用dapper的动态结果

C# 在mvc中使用dapper的动态结果,c#,asp.net-mvc,asp.net-core,dapper,C#,Asp.net Mvc,Asp.net Core,Dapper,我正在尝试下面的方法,使用dapper和存储过程返回动态结果。我这样做对吗 using (IDbConnection dbConnection = Connection) { dbConnection.Open(); var result = dbConnection.Query<dynamic>("LMSSP_GetSelectedTableData", new { TableName = TableName

我正在尝试下面的方法,使用dapper和存储过程返回动态结果。我这样做对吗

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

        }
    }
}
使用(IDbConnection dbConnection=Connection)
{
dbConnection.Open();
var result=dbConnection.Query(“LMSSP\u GetSelectedTableData”,
新的
{
TableName=TableName,
LangaugeID=AppTenant.SelectedLanguageID,
UserID=AppTenant.UserID
},commandType:commandType.StoredProcess.ToList();
如果(结果!=null)
{
//添加只是为了检查数据
foreach(IDictionary)result.FirstOrDefault()中的变量项)
{
字符串键=item.key;
字符串值=item.value.ToString();
}
}
}
我的存储过程所做的是,我将传递任何表名,并在此基础上返回结果/记录。因此,显然,我的记录数、列数将根据传递的表名而变化

为了实现这一点,我使用了动态关键字和dapper

因此,我的问题是如何将此数据作为模型传递给视图,并根据属性/列数据类型呈现视图上的控件。我可以获取列或属性信息的数据类型吗


但是,当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; }
}
模型将具有控制信息列表

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

希望有帮助。

这里我们调用返回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);
        }
    }
最后我们调用“ToDataTable”方法来更改datatable中的响应。我们将从数据库接收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;
    } 
公共数据表到数据表(IEnumerable items)
{
如果(items==null)返回null;
var data=items.ToArray();
if(data.Length==0)返回null;
var dt=新数据表();
foreach(变量对在((IDictionary)数据[0]))
{
Add(pair.Key,(pair.Value??string.Empty).GetType());
}
foreach(数据中的var d)
{
Add(((IDictionary)d).Values.ToArray());
}
返回dt;
} 

如果您的存储过程返回不同的模式,则这对我来说表明数据库设计不好input@Rob它只针对少数表,主要是我们手中的系统表,而不是客户机。你能告诉我解决办法吗?
    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);
        }
    }
public class DataConnection
{
    public IDbConnection DapperConnection
    {
        get
        {
            return new SqlConnection(ConfigurationManager.ConnectionStrings["MainConnection"].ToString());
        }
    }
}
    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;
    }