如何获取Web api结果的Entity Framework动态查询结果

时间:2017-08-13 08:39:24

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

我正在开发一个报告查看器作为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这样的回应。

enter image description here

我的查询响应属性丢失了。

1 个答案:

答案 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>