如何执行RAW SQL查询并将其转储到ASP.NET MVC 5(EF 6)中的JSON?

时间:2018-08-23 10:40:53

标签: sql json asp.net-mvc entity-framework-6

我要执行如下所示的原始SQL查询:

select material, method, count(*) 
from treatment 
group by material, method

并将其作为JSON对象返回。

由于EF 6允许执行原始查询(即Database.SQLQuery()),因此我使用它来创建JSON对象。

我的代码如下。

// GET: Dummy
public string Dummy()
{
    string query = "select material, method, count(*) as cnt from Treatment "
                   + " group by material, method";
    var result = db.Database.SqlQuery<List<String>>(query);
    var jsonResult = JsonConvert.SerializeObject(result);

    return jsonResult;
}

但是,我没有获得带有材质和方法的JSON对象,而是得到了一个空的json对象。

[[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]]

是否可以在没有原始查询模型的情况下返回正确的JSON对象?如果是这样,如何更新我的代码以返回正确的结果?

预先感谢

3 个答案:

答案 0 :(得分:2)

您无法将该查询解析为字符串列表,您需要将其解析为一个(或多个)类,如下所示:

public static string Dummy()
{
    using (var db = new TestDbEntities())
    {
        string query = "select 'material' as material , 'method' as method, 1  as cnt  ";
        var result = db.Database.SqlQuery<MyClass>(query);
        var res = result.ToList();
        var jsonResult = JsonConvert.SerializeObject(res);
        return jsonResult;
    }
}

您的班级将是这样的:

public class MyClass
{
    public string Material { get; set; }

    public string Method { get; set; }

    public int Cnt { get; set; }
}

答案 1 :(得分:1)

您需要使用具有匹配属性名称(确保它们具有完全相同的名称和正确的大小写)和无参数构造函数的类来捕获具有多列的查询结果集:

public string Dummy()
{
    string query = "select material as Material, method as Method, count(*) as Cnt from Treatment group by material, method";
    var result = db.Database.SqlQuery<ResultSet>(query).ToList();
    var jsonResult = JsonConvert.SerializeObject(result);
    return jsonResult;
}

public class ResultSet
{
    public string Material { get; set; }

    public string Method { get; set; }

    public int Cnt { get; set; }
}

请注意,Database.SqlQuery<T>将返回类型为IEnumerable<T>的{​​{1}},因此System.Data.Entity.Internal.InternalSqlQuery<T>在此情况下不适合。如果仅返回单个结果集,则应使用List<string>而不是Database.SqlQuery<string>(...).ToList()

类似的问题:

Entity framework raw SQL Query

答案 2 :(得分:0)

使用FOR JSON AUTO:

     string query = "select material, method, count(*) as cnt from Treatment "
        + " group by material, method FOR JSON AUTO";