如何从SQL查询返回动态对象

时间:2014-08-25 21:06:59

标签: c# sql entity-framework asp.net-web-api dbcontext

我有一个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列。我无法控制的是自定义字段名称和自定义字段数。

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;}
}