C# 如何在Web API中执行返回透视表的存储过程
如何执行返回透视表的存储过程,并在API中以JSON的形式返回数据。我想使用API在网页上显示它的数据。我得到的只是一个对象列表,而不是其中的数据。 我的过程是返回其中983个表行记录。。。但列会根据传递的参数进行更改 所以对于一种参数,我可以有20列购买,对于另一种,我可以只有1列 通过使用C# 如何在Web API中执行返回透视表的存储过程,c#,stored-procedures,visual-studio-2015,asp.net-apicontroller,jsonresult,C#,Stored Procedures,Visual Studio 2015,Asp.net Apicontroller,Jsonresult,如何执行返回透视表的存储过程,并在API中以JSON的形式返回数据。我想使用API在网页上显示它的数据。我得到的只是一个对象列表,而不是其中的数据。 我的过程是返回其中983个表行记录。。。但列会根据传递的参数进行更改 所以对于一种参数,我可以有20列购买,对于另一种,我可以只有1列 通过使用 var ls = db.Database.SqlQuery<dynamic>("exec [Sp_StoreItemParty] 'Amount','01-Apr-2020'
var ls = db.Database.SqlQuery<dynamic>("exec [Sp_StoreItemParty] 'Amount','01-Apr-2020', '06-Sep-2020','', '', '', ''").ToList();
return Json(ls, JsonRequestBehavior.AllowGet);
var ls=db.Database.SqlQuery(“exec[Sp_StoreItemParty]‘金额’、‘2020年4月1日’、‘2020年9月6日’、‘’、‘’、‘’、‘’、‘’).ToList();
返回Json(ls,JsonRequestBehavior.AllowGet);
如何执行返回透视表的存储过程,并将其作为JSON格式的Web API返回。我得到的只是一个对象列表,但没有一个对象可以在Firefox上的Postman中进一步访问或显示。
1.首先需要创建数据传输对象。 2.添加DbContext数据传输对象 公共数据库查询类{get;set;} 3.var data=db.YourClass.FromSql(“EXEC DashBoard”).ToList() 注:除实体类型外,EF核心模型还可以包含查询类型,可用于对未映射到实体类型的数据执行数据库查询 何时使用查询类型 用作临时FromSql()查询的返回类型 映射到数据库视图 映射到未定义主键的表
映射到模型中定义的查询。因为对象是动态对象,所以必须在运行时通过反射解析对象的结构 然后,当您拥有对象的每个属性的名称和值时,您可以手动构建json
Type myType = myObject.GetType();
IList<PropertyInfo> props = new List<PropertyInfo>(myType.GetProperties());
foreach (PropertyInfo prop in props)
{
String propName = prop.name;
object propValue = prop.GetValue(myObject, null);
// Do something with propValue
}
Type myType=myObject.GetType();
IList props=新列表(myType.GetProperties());
foreach(PropertyInfo props in props)
{
字符串propName=prop.name;
object propValue=prop.GetValue(myObject,null);
//做有价值的事
}
小提示:
反射可以是非常有效和复杂的逻辑。
如果您可以更改存储过程以返回列的固定子集,它将更快、更简单。
SqlQuery
仅适用于已知类型,而不适用于dynamic
。你可以
public static IEnumerable<dynamic> CollectionFromSql(this DbContext dbContext, string Sql, Dictionary<string, object> Parameters)
{
using (var cmd = dbContext.Database.GetDbConnection().CreateCommand())
{
cmd.CommandText = Sql;
if (cmd.Connection.State != ConnectionState.Open)
cmd.Connection.Open();
foreach (KeyValuePair<string, object> param in Parameters)
{
DbParameter dbParameter = cmd.CreateParameter();
dbParameter.ParameterName = param.Key;
dbParameter.Value = param.Value;
cmd.Parameters.Add(dbParameter);
}
//var retObject = new List<dynamic>();
using (var dataReader = cmd.ExecuteReader())
{
while (dataReader.Read())
{
var dataRow = GetDataRow(dataReader);
yield return dataRow ;
}
}
}
}
private static dynamic GetDataRow(DbDataReader dataReader)
{
var dataRow = new ExpandoObject() as IDictionary<string, object>;
for (var fieldCount = 0; fieldCount < dataReader.FieldCount; fieldCount++)
dataRow.Add(dataReader.GetName(fieldCount), dataReader[fieldCount]);
return dataRow;
}
公共静态IEnumerable CollectionFromSql(此DbContext DbContext、字符串Sql、字典参数)
{
使用(var cmd=dbContext.Database.GetDbConnection().CreateCommand())
{
cmd.CommandText=Sql;
if(cmd.Connection.State!=ConnectionState.Open)
cmd.Connection.Open();
foreach(参数中的KeyValuePair参数)
{
DbParameter DbParameter=cmd.CreateParameter();
dbParameter.ParameterName=param.Key;
dbParameter.Value=参数值;
cmd.Parameters.Add(dbParameter);
}
//var retObject=新列表();
使用(var dataReader=cmd.ExecuteReader())
{
while(dataReader.Read())
{
var dataRow=GetDataRow(dataReader);
产生返回数据行;
}
}
}
}
私有静态动态GetDataRow(DbDataReader dataReader)
{
var dataRow=new ExpandoObject()作为IDictionary;
对于(var fieldCount=0;fieldCount
用法:
List<dynamic> MyList = MyDbContext.CollectionFromSql("SELECT * FROM \"User\" WHERE UserID = @UserID",
new Dictionary<string, object> { { "@UserID", 1 } }).ToList();
List MyList=MyDbContext.CollectionFromSql(“从\“User\”中选择*其中UserID=@UserID”,
新字典{{@UserID,1}});
只有在过程中返回特定数量的列时,使用
get set
创建一个类才有效。其中不能保证有20列或100列。