0

我们有一个包含大量数据的表,我不想为我的 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 当然不知道记录的总数,因此分页不可用。

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

非常感谢

4

1 回答 1

0

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

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

LoadResult 有一个名为 totalCount 的参数,因此请使用数据的实际计数对其进行设置:

result.totalCount = salesOrderCount;

进而

return result;

现在 dxDataGrid 知道记录的总数。

于 2021-03-12T14:47:02.587 回答