我想知道是否有人能帮助我,我一直在试图弄清楚如何在OData feed (v4) Web API 2中实现自定义分页以供power bi feed使用,但一直没有成功。
数据是从数据库派生的,使用联接来组合5个表,这使得它不适用于Entity Framework,除了使用Entity Framework非常慢(一个控制器的45k条记录)。
我尝试过许多不同的方法,从设置记录的总数以欺骗框架并填充带有空列表成员的分页结果,到下面更基本的示例。然而,我仍然无法正确地获取客户端(Power BI)接受分页结果,而不返回控制器中极大数量的记录。请参见简化的查询和代码,任何帮助都将非常欢迎,因为似乎没有清晰的示例可以在不使用Entity Framework的情况下完成此操作。
以下代码可以工作,但我反复遇到同样的问题,即框架在返回之后对列表进行分页,而不管我在此之前做了什么
T-SQL存储过程:
CREATE PROCEDURE [dbo].[GetOrders] @CompanyID int,
@Skip INT,
@Take INT
AS
BEGIN
SET NOCOUNT ON;
SELECT *
FROM Orders
WHERE CompanyID = @CompanyID
ORDER BY t.OrderID
OFFSET @Skip ROWS FETCH NEXT @Take ROWS ONLY
END
指向调用上述查询的存储库的控制器[EnableQuery]
public async Task<PageResult<Order>> GetOrders(ODataQueryOptions<Order> queryOptions)
{
int CompanyID = User.Identity.GetCompanyID().TryParseInt(0);
ODataQuerySettings settings = new ODataQuerySettings()
{
PageSize = 100,
};
int OrderCount = _OrderRepo.GetOrderCount(CompanyID);
int Skip = 0;
if (queryOptions.Skip != null)
{
Skip = queryOptions.Skip.Value;
}
IEnumerable<Order> results = await _OrderRepo.GetAll(CompanyID, Skip, 100);
IQueryable result = queryOptions.ApplyTo(results.AsQueryable(), settings);
Uri uri = Request.ODataProperties().NextLink;
Request.ODataProperties().TotalCount = OrderCount;
PageResult<Order> response = new PageResult<Order>(
result as IEnumerable<Order>,
uri, Request.ODataProperties().TotalCount);
return response;
}
此处的分页由框架在return response;
之后完成。
OFFSET
和FETCH
来编写 SQL 查询呢? - Mark C.