问题描述
如何执行存储过程以在API中返回数据透视表并以JSON形式返回数据。我想使用API在网页上显示其数据。我得到的只是对象列表,而不是其中的数据。 我的过程正在其中返回表行的983条记录...但是根据传递的参数来更改列 因此,对于一种参数,我可以有20列购买,对于另一种参数,我可以只有1列 通过使用
执行过程 var ls = db.Database.SqlQuery<dynamic>("exec [Sp_StoreItemParty] 'Amount','01-Apr-2020','06-Sep-2020','',''").ToList();
return Json(ls,JsonRequestBehavior.AllowGet);
如何执行存储过程以返回数据透视表并以JSON格式将其作为Web API返回。我得到的只是对象列表,但是在Firefox上的Postman中,无法进一步访问或进一步显示任何对象。
解决方法
SqlQuery
仅适用于已知类型,不适用于dynamic
。你可以
-
要么创建一个代表您的结果记录的类,然后使用它。或者
-
使用here所示的数据读取器并复制下面的内容。
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; }
用法:
List<dynamic> MyList = MyDbContext.CollectionFromSql("SELECT * FROM \"User\" WHERE UserID = @UserID",new Dictionary<string,object> { { "@UserID",1 } }).ToList();
由于对象是动态对象,因此必须在运行时通过反射来解析对象的结构。
然后,当您具有对象的每个属性的名称和值时,可以手动构建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
}
小提示: 反思可能是非常有效的,而且该死的复杂逻辑。 如果您可以更改存储过程以返回固定的列子集,则会更快,更简单。
,1.frist您需要创建数据传输对象。 2.添加DbContext数据传输对象 公共DbQuery YourClass {get;组; } 3.var data = db.YourClass.FromSql(“ EXEC DashBoard”)。ToList();
note除实体类型外,EF Core模型还可包含查询类型,这些查询类型可用于对未映射到实体类型的数据执行数据库查询。
何时使用查询类型?
用作临时FromSql()查询的返回类型。
映射到数据库视图。
映射到未定义主键的表。
映射到模型中定义的查询。