我有一个storeprocdure返回集合的情况,但我不知道对象结构如何,因为查询非常动态。
一个查询可以返回:
Id |位置| MarketSegment | ...... 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个自定义字段。因此,如果您为User1运行SP并且他有5个自定义字段,则每个自定义字段将在列中表示,但如果User2有3个自定义字段,则仅表示3列。我无法控制的是自定义字段名称和自定义字段数。
答案 0 :(得分:6)
您无法将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);
}
答案 1 :(得分:1)
如果使用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)
答案 2 :(得分:0)
如果您知道可以返回所有可能的列,那么使用具有超出您需要的属性的类就没有问题。
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;}
}