如何执行存储过程以返回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中,无法进一步访问或进一步显示任何对象。

all i get is a list of objects but none of the objects can further be accessed or further displayed in Postman on On Firefox,where as in SQL server I'm getting data that i need.

解决方法

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

  1. 要么创建一个代表您的结果记录的类,然后使用它。或者

  2. 使用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()查询的返回类型。

映射到数据库视图。

映射到未定义主键的表。

映射到模型中定义的查询。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...