【发布时间】:2019-07-16 11:45:11
【问题描述】:
我们需要将 ODATA-V4 查询搜索、order by 子句直接传递给数据库。
情况如下:
- 表之间存在连接,我们调用(内联)表值 使用 SQL 获取所需记录的函数。
- ODATA where 子句需要应用于结果集,然后我们 应用分页 Skip、Take 和 Order By。
我们从 Dapper 开始,但是 Dapper 仅支持 IEnumerable,因此 Dapper 会从 DB 中获取整个记录,然后仅应用 OData(查询选项 ApplyTo)分页,从而破坏了性能提升 :-(
[ODataRoute("LAOData")]
[HttpGet]
public IQueryable<LAC> GetLAOData(ODataQueryOptions<LAC> queryOptions)
{
using (IDbConnection connection = new SqlConnection(RoutingConstants.CascadeConnectionString))
{
var sql = "<giant sql query";
IQueryable<LAC> iqLac = null;
IEnumerable<LAC> sqlRes = connection.Query<LAC>(sql, commandTimeout: 300);
**IQueryable<LAC> iq = sqlRes.AsQueryable();
iqLac = queryOptions.ApplyTo(iq) as IQueryable<LAC>;
return iqLac;**
}
}
我们在存储过程中看到的大多数示例,视图支持显然返回列表。 https://hackernoon.com/execute-a-stored-procedure-that-gets-data-from-multiple-tables-in-ef-core-1638a7f010c
我们能否将 EF Core 2.2 配置为返回 IQueryable 以便 ODATA 可以 进一步过滤掉,然后只产生所需的计数,比如 10。?
【问题讨论】:
-
见stackoverflow.com/questions/52975726/… 和stackoverflow.com/questions/52994531/…。
FromSql返回IQueryable,但为了可组合,SQL 应该以 SELECT 开头,所以 View / TVF - 很好,SP - 没有。
标签: c# entity-framework-core odata asp.net-core-2.2 ef-core-2.2