C# 如何在Web API中执行返回透视表的存储过程

C# 如何在Web API中执行返回透视表的存储过程,c#,stored-procedures,visual-studio-2015,asp.net-apicontroller,jsonresult,C#,Stored Procedures,Visual Studio 2015,Asp.net Apicontroller,Jsonresult,如何执行返回透视表的存储过程,并在API中以JSON的形式返回数据。我想使用API在网页上显示它的数据。我得到的只是一个对象列表,而不是其中的数据。 我的过程是返回其中983个表行记录。。。但列会根据传递的参数进行更改 所以对于一种参数,我可以有20列购买,对于另一种,我可以只有1列 通过使用 var ls = db.Database.SqlQuery<dynamic>("exec [Sp_StoreItemParty] 'Amount','01-Apr-2020'

如何执行返回透视表的存储过程,并在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);
var ls=db.Database.SqlQuery(“exec[Sp_StoreItemParty]‘金额’、‘2020年4月1日’、‘2020年9月6日’、‘’、‘’、‘’、‘’、‘’).ToList();
返回Json(ls,JsonRequestBehavior.AllowGet);
如何执行返回透视表的存储过程,并将其作为JSON格式的Web API返回。我得到的只是一个对象列表,但没有一个对象可以在Firefox上的Postman中进一步访问或显示。


1.首先需要创建数据传输对象。 2.添加DbContext数据传输对象 公共数据库查询类{get;set;} 3.var data=db.YourClass.FromSql(“EXEC DashBoard”).ToList()

注:除实体类型外,EF核心模型还可以包含查询类型,可用于对未映射到实体类型的数据执行数据库查询

何时使用查询类型

用作临时FromSql()查询的返回类型

映射到数据库视图

映射到未定义主键的表


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

因为对象是动态对象,所以必须在运行时通过反射解析对象的结构

然后,当您拥有对象的每个属性的名称和值时,您可以手动构建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
}
Type myType=myObject.GetType();
IList props=新列表(myType.GetProperties());
foreach(PropertyInfo props in props)
{
字符串propName=prop.name;
object propValue=prop.GetValue(myObject,null);
//做有价值的事
}
小提示: 反射可以是非常有效和复杂的逻辑。
如果您可以更改存储过程以返回列的固定子集,它将更快、更简单。

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

  • 创建一个表示结果记录的类并使用它。或

  • 使用如图所示的数据读取器并复制粘贴到下面

    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;
    }
    
    公共静态IEnumerable CollectionFromSql(此DbContext DbContext、字符串Sql、字典参数)
    {
    使用(var cmd=dbContext.Database.GetDbConnection().CreateCommand())
    {
    cmd.CommandText=Sql;
    if(cmd.Connection.State!=ConnectionState.Open)
    cmd.Connection.Open();
    foreach(参数中的KeyValuePair参数)
    {
    DbParameter DbParameter=cmd.CreateParameter();
    dbParameter.ParameterName=param.Key;
    dbParameter.Value=参数值;
    cmd.Parameters.Add(dbParameter);
    }
    //var retObject=新列表();
    使用(var dataReader=cmd.ExecuteReader())
    {
    while(dataReader.Read())
    {
    var dataRow=GetDataRow(dataReader);
    产生返回数据行;
    }
    }
    }
    }
    私有静态动态GetDataRow(DbDataReader dataReader)
    {
    var dataRow=new ExpandoObject()作为IDictionary;
    对于(var fieldCount=0;fieldCount
    用法:

    List<dynamic> MyList = MyDbContext.CollectionFromSql("SELECT * FROM \"User\" WHERE UserID = @UserID",
        new Dictionary<string, object> { { "@UserID", 1 } }).ToList();
    
    List MyList=MyDbContext.CollectionFromSql(“从\“User\”中选择*其中UserID=@UserID”,
    新字典{{@UserID,1}});
    

  • 只有在过程中返回特定数量的列时,使用
    get set
    创建一个类才有效。其中不能保证有20列或100列。