c# - 在没有 Entity Framework 的情况下使用带有 OData 提要 C# 的存储过程进行自定义分页

标签 c# pagination asp.net-web-api2 odata powerbi

我想知道是否有人可以帮助我,一段时间以来我一直在尝试弄清楚如何在 OData feed (v4) Web API 2 中实现自定义分页以提供 power bi feed 但没有成功。

数据首先从数据库派生,数据库是使用连接的 5 个表的组合,这使得它不适合与 Entity Framework 一起使用,除了使用 Entity Framework 真的很慢(一个 Controller 中有 45k 条记录) .

我尝试了很多不同的方法,从设置记录总数以欺骗框架并用列表的空成员填充分页结果,到下面更基本的示例。但是,如果不从 Controller 返回大量记录,我仍然无法让客户端 (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

指向调用上述查询的 repo 的 Controller

[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;之后完成的。

最佳答案

在不知道您的全部要求的情况下,我假设此数据的最终目的地是 Power Bi 报告。因此,我建议您完全跳过特殊的分页代码,让 Power Bi 桌面直接连接到 SQL Server 以访问表。

Power Bi 桌面将尽最大努力为您重新创建关系。如果您的原始表和 ID 以直截了当的方式命名,Power Bi 桌面可以很好地为您重新创建关系。试一试。

导入完成后,您可以在 click on the Relationship View 时检查关系.如果关系有误,请双击它以删除或编辑。

如果您担心每次运行报表都会损害数据库的性能,Power Bi 的默认模式是导入数据的副本。如果数据小于 1GB,建议这样做。

对于较大的数据集,有一个 DirectQuery可以尝试的选项。 DirectQuery 是为了响应加载更大数据集的需要而开发的,并且有其局限性(单一来源数据库,无法处理过于复杂的查询,数据库性能,以及一些视觉效果在功能上受到限制)。

关于c# - 在没有 Entity Framework 的情况下使用带有 OData 提要 C# 的存储过程进行自定义分页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48590094/

相关文章:

c# - 未找到 WebApi Controller 测试方法

c# - 后台工作人员的 ReportProgress 百分比参数 C#

c# - 什么是 linq "best practices"

c# - 带有 Mysql 数据库的 asp.net web api

jQuery Datatable,保存表的状态,如分页、搜索等

spring - 如何在 MyBatis 中使用 PagingAndSorting?

c# - 'DelegatingHandler' 列表无效,因为 'InnerHandler' 的属性 'handler' 不为空

c# - ASP.NET MVC 传递多个模型以从 Controller 查看

c# - 比较两个字典并返回另一个字典中的差异

pagination - 限制在多对多 Sequelize 中不起作用