我要执行如下所示的原始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对象?如果是这样,如何更新我的代码以返回正确的结果?
预先感谢
答案 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()
。
类似的问题:
答案 2 :(得分:0)
使用FOR JSON AUTO:
string query = "select material, method, count(*) as cnt from Treatment "
+ " group by material, method FOR JSON AUTO";