【问题标题】:Pagination on DevExtreme dxDataGrid with Skip / Take loadOptions使用 Skip / Take loadOptions 在 DevExtreme dxDataGrid 上进行分页
【发布时间】:2021-03-08 10:32:51
【问题描述】:

我们有一个包含大量数据的表,我不想为我的 dxDataGrid 一次加载它。

我想用 dxDataGrid 的 DataSourceLoadOptions 提供的 Skip / Take 实现分页。

这是我的控制器:

[HttpGet]
    public async Task<Object> GetSalesOrdersWithTotals(DataSourceLoadOptions loadOptions)
    {
        try
        {
            var results =  await SalesOrderService.GetSalesOrdersWithTotals(loadOptions.Skip, loadOptions.Take, 40);
            loadOptions.Skip = 0;
            loadOptions.Take = 0;
            return DataSourceLoader.Load(results, loadOptions);
        }
        catch (Exception ex)
        {
            return Json(new { code = "422", success = false, message = "Unable to fetch sales orders with totals - " + ex.ToString() });
        }
    }

这是返回数据的服务:

public async Task<IEnumerable<SalesOrderWithTotals>> GetSalesOrdersWithTotals(int skip, int take, int defaultPageSize)
    {
        if (take == 0)
        {
            //Fix for passing a 0 take
            take = defaultPageSize;
        }
        var salesOrderWithTotals =
        from o in _context.SalesOrder
        select new SalesOrderWithTotals
        {
            SalesOrderId = o.SalesOrderId,
            Net = _context.SalesOrderItem.Where(it => it.SalesOrderId == o.SalesOrderId).Select(it => it.Qty == null ? 0 : it.Qty.Value * it.UnitPrice == null ? 0 : it.UnitPrice.Value).Sum(),
            Tax = _context.SalesOrderItem.Where(it => it.SalesOrderId == o.SalesOrderId).Select(it => it.Qty == null ? 0 : it.Qty.Value * it.UnitPrice == null ? 0 : it.UnitPrice.Value).Sum() * (o.Tax.Percentage /100),
            Gross = _context.SalesOrderItem.Where(it => it.SalesOrderId == o.SalesOrderId).Select(it => it.Qty == null ? 0 : it.Qty.Value * it.UnitPrice == null ? 0 : it.UnitPrice.Value).Sum() + _context.SalesOrderItem.Where(it => it.SalesOrderId == o.SalesOrderId).Select(it => it.Qty == null ? 0 : it.Qty.Value * it.UnitPrice == null ? 0 : it.UnitPrice.Value).Sum() * (o.Tax.Percentage / 100),
            Name = o.Customer.Name,
            CustomerOrderNumber = o.CustomerOrderNumber,
            Contact = o.Contact,
            OrderDate = o.OrderDate
        };
        return await salesOrderWithTotals.Skip(skip).Take(take).ToListAsync();
    }

查看 SQL 分析器,这需要前 40 条记录,但当然 dxDataGrid 不知道记录的总数,因此分页不可用。

在这种情况下,实现我想要的最佳方法是什么?

非常感谢

【问题讨论】:

    标签: devexpress devextreme dx-data-grid


    【解决方案1】:

    您必须执行额外查询以获取 SalesOrder 的计数并将其保存在例如 salesOrderCount 中。然后保持Load方法返回数据如下。

    LoadResult result = DataSourceLoader.Load(results, loadOptions);
    

    LoadResult 有一个名为 totalCount 的参数,因此请使用数据的实际计数来设置它:

    result.totalCount = salesOrderCount;
    

    然后

    return result;
    

    现在 dxDataGrid 知道记录的总数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-20
      • 2013-11-26
      • 1970-01-01
      • 1970-01-01
      • 2023-03-24
      • 1970-01-01
      • 2010-10-20
      • 1970-01-01
      相关资源
      最近更新 更多