[英]How to return dynamic object from SQL query
我有一个storeprocdure返回集合的情况,但是由于查询是非常动态的,所以我没有对象的结构。
一个查询可以返回:
ID | 位置| 市场细分| ... n列
另一个可以返回
ID | 销售代表| 位置| 地区| ... n列
我只是返回一个“对象”,如下面的代码所示。 我知道这行不通,但是如何设置它呢?
using (DbContext db = new Context())
{
var items = db.Database.SqlQuery<object>(
"SP @Param1, @Param2",
new SqlParameter("Param1", ped),
new SqlParameter("Param2", 25)
).ToList();
return Request.CreateResponse<List<object>>(HttpStatusCode.OK, items);
}
编辑:
我不知道显示SP是否会有所帮助,除非我可以进一步解释。
每列均表示为“自定义字段”。 用户能够创建n个自定义字段。 因此,如果您为用户1运行SP,并且他有5个自定义字段,则每个自定义字段都将在“列”中表示,但是,如果用户2有3个自定义字段,则仅将显示3列。 我无法控制的是“自定义字段名称”和自定义字段的数量。
您不能将SqlQuery<T>
用于自定义字段。
创建一个原始SQL查询,该查询将返回给定泛型类型的元素。 该类型可以是具有与查询返回的列名相匹配的属性的任何类型,也可以是简单的原始类型。 -MSDN
但是,您可以使用ExecuteReader
来实现。
using (var db = new Context())
{
db.Database.Connection.Open();
var cmd = db.Database.Connection.CreateCommand();
cmd.CommandText = "SP @Param1, @Param2";
cmd.Parameters.Add(new SqlParameter("Param1", ped));
cmd.Parameters.Add(new SqlParameter("Param2", 25));
List<List<object>> items = new List<List<object>>();
var reader = cmd.ExecuteReader();
while (reader.Read())
{
var item = new List<Object>();
items.Add(item);
for (int i = 0; i < reader.FieldCount ; i++)
item.Add(reader[i]);
}
return Request.CreateResponse<List<object>>(HttpStatusCode.OK, items);
}
如果您知道可以返回所有可能的列,那么使用具有比所需更多属性的类就没有问题。
public class Data
{
public int ID {get;set;}
public string SalesRep {get;set;}//Simply will be empty in the first example, but populated in the second.
public string Location {get;set;}
}
如果在SQL 2016或更高版本上,请在查询中添加“ FOR JSON AUTO”以JSON形式返回,例如:
var json = db.Database.SqlQuery<string>("Select x, y, z FROM tbl FOR JSON AUTO").First();
然后使用Json.Net使用以下命令创建动态对象
var myDynamic = JObject.Parse(json)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.