我正在开发一个报告查看器作为ap.net web api应用程序。所以我需要一个实体框架动态查询结果。
insert into table(col1,col2)
SELECT year,COUNT(SalesOrderID) AS TotalOrders
FROM (
SELECT SalesPersonID, SalesOrderID, YEAR(OrderDate) AS [Year]
FROM Sales.SalesOrderHeader) as t1
GROUP BY Year
我的sql查询返回任何类型的对象,如下所示:
(姓名,总计)
(姓名,总数,类别)
(姓名,TOtal,CityOnoTotal,CityTwoTotal)
所以我想在我的asp.net web api动作方法中使用这个结果。查询运行和 得到一些结果。
我过去常常看到Postman这样的回应。
我的查询响应属性丢失了。
答案 0 :(得分:2)
我认为这不起作用,因为EF
在动态对象中根本没有返回属性,对于解释的情况。
它以其他方式工作,First EF
获取提供的Generic Type
属性的所有属性,然后它尝试将属性映射到SQL请求结果。
因此,如果您不知道字段列表是什么,结果EF
将不会为您生成它。
第一个解决方案是解析选择列表以定义字段并生成动态类。查看how to create dynamic class讨论。比你可以做的更像
var dType = MyTypeBuilder.CompileResultType("sample", new Dictionary<string, Type>
{
{ "Id", typeof(int) }
});
var db = new Model1().Database;
var sql = db.GetType().GetMethods().Where(m => m.Name == "SqlQuery" && m.IsGenericMethod);
var gen = sql.First().MakeGenericMethod(dType);
var result = gen.Invoke(db, new object[] { "[Your SQL]", new object[0] });
var ie = (result as IEnumerable<object>);
这真的很复杂,但有效
第二次 - 您可以使用SQLCommand
执行经典ADO context.Database.Connection
并解析结果
第三种解决问题的方法是尽可能从SQL返回XML。
var query = db.SqlQuery<string>("[Your SQL] for XML PATH('item'), root('root')").First();
将返回XML格式的所有数据,如:
<root>
<item>
<Id>5</Id>
...
</item>
<item>
<Id>6</Id>
...
</item>
</root>