C# 在mvc中使用dapper的动态结果
我正在尝试下面的方法,使用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
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;
}