首页 > 解决方案 > 如何在 Web API 中执行返回数据透视表的存储过程

问题描述

如何执行返回数据透视表的存储过程并在 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 中进一步访问或进一步显示。 我得到的只是一个对象列表,但没有一个对象可以在 Firefox 上的 Postman 中进一步访问或进一步显示,就像在 SQL 服务器中一样,我正在获取我需要的数据。

标签: c#stored-proceduresvisual-studio-2015asp.net-apicontrollerjsonresult

解决方案


SqlQuery仅适用于已知类型,不适用于dynamic. 你可以

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

  2. 使用此处所示的数据阅读器并复制粘贴在下面。

    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();
    

推荐阅读