繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM