如何在 Web API 中执行返回数据透视表 table 的存储过程
How to execute a stored procedure returning a pivot table in Web API
如何执行存储过程return将数据透视表 table 和 return 数据作为 API 中的 JSON。我想使用 API 在网页上显示它的数据。我得到的只是 objects 的列表,而不是其中的数据。
我的程序是 returning 983 条记录,其中 table 行...但是列会根据传递的参数更改
因此,对于一种参数,我可以购买 20 列,而另一种我只能购买 1
通过使用
执行程序
var ls = db.Database.SqlQuery<dynamic>("exec [Sp_StoreItemParty] 'Amount','01-Apr-2020', '06-Sep-2020','', '', '', ''").ToList();
return Json(ls, JsonRequestBehavior.AllowGet);
如何执行存储过程return将数据透视表 table 和 return 其作为 JSON 格式的 Web API。我得到的只是 objects 的列表,但是 objects 的 none 可以在 Firefox 上的 Postman 中进一步访问或进一步显示。
1.frist 您需要创建数据传输对象。
2.Add DbContext 数据传输对象
public DbQuery YourClass { 得到;放; }
3.var data = db.YourClass.FromSql("EXEC DashBoard").ToList();
注意除了实体类型之外,EF Core 模型还可以包含查询类型,这些类型可用于对未映射到实体类型的数据执行数据库查询。
何时使用查询类型?
作为临时 FromSql() 查询的 return 类型。
映射到数据库视图。
映射到没有定义主键的表。
映射到模型中定义的查询。
因为你的对象是动态对象,你必须在运行时通过反射解析对象的结构。
然后,当您拥有对象的每个 属性 的名称和值时,您可以手动构建您的 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
}
小提示:
反射可以是非常高效和该死的复杂逻辑。
如果您可以将存储过程更改为 return 列的固定子集,它将更快更简单。
SqlQuery
仅适用于已知类型,不适用于 dynamic
。你可以
创建一个代表您的结果记录的 class 并使用它。或者
使用数据 reader 如图所示 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();
如何执行存储过程return将数据透视表 table 和 return 数据作为 API 中的 JSON。我想使用 API 在网页上显示它的数据。我得到的只是 objects 的列表,而不是其中的数据。 我的程序是 returning 983 条记录,其中 table 行...但是列会根据传递的参数更改 因此,对于一种参数,我可以购买 20 列,而另一种我只能购买 1 通过使用
执行程序 var ls = db.Database.SqlQuery<dynamic>("exec [Sp_StoreItemParty] 'Amount','01-Apr-2020', '06-Sep-2020','', '', '', ''").ToList();
return Json(ls, JsonRequestBehavior.AllowGet);
如何执行存储过程return将数据透视表 table 和 return 其作为 JSON 格式的 Web API。我得到的只是 objects 的列表,但是 objects 的 none 可以在 Firefox 上的 Postman 中进一步访问或进一步显示。
1.frist 您需要创建数据传输对象。 2.Add DbContext 数据传输对象 public DbQuery YourClass { 得到;放; } 3.var data = db.YourClass.FromSql("EXEC DashBoard").ToList();
注意除了实体类型之外,EF Core 模型还可以包含查询类型,这些类型可用于对未映射到实体类型的数据执行数据库查询。
何时使用查询类型?
作为临时 FromSql() 查询的 return 类型。
映射到数据库视图。
映射到没有定义主键的表。
映射到模型中定义的查询。
因为你的对象是动态对象,你必须在运行时通过反射解析对象的结构。
然后,当您拥有对象的每个 属性 的名称和值时,您可以手动构建您的 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
}
小提示: 反射可以是非常高效和该死的复杂逻辑。 如果您可以将存储过程更改为 return 列的固定子集,它将更快更简单。
SqlQuery
仅适用于已知类型,不适用于 dynamic
。你可以
创建一个代表您的结果记录的 class 并使用它。或者
使用数据 reader 如图所示 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();