如何在 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。你可以

  1. 创建一个代表您的结果记录的 class 并使用它。或者

  2. 使用数据 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();