Bootstrap Blazor 组件库 Table 组件 OnQueryAsync 查询 EF Core 键集分页、偏移分页 使用备忘

private long lastId = 0, firstId = 0;
private long lastPageIndex = 0;
private int lastPageItems = 0;
private async Task> OnQueryAsync(QueryPageOptions options)
{
    IEnumerable items;
    // 不是翻页:刷新、改变每页条数、过虑,此时,清除跟踪(清除缓存)
    if (!options.IsTriggerByPagination)
    {
        TLog.TLogDb.ChangeTracker.Clear();
    }
    // Filter 过滤处理
    var efQuery = TLog.TLogDb.TLogEntitys.AsQueryable();
    if (options.Filters.Count > 0)
    {
        efQuery = efQuery.Where(options.ToFilterLambda());
    }
    // 每页条数不变、前后翻1页:使用 键集分页(Keyset pagination)方式
    if (options.PageItems == lastPageItems && Math.Abs(options.PageIndex - lastPageIndex) == 1)
    {
        if (options.PageIndex > lastPageIndex)
        {
            items = await efQuery.OrderBy(t => t.Id).Where(t => t.Id > lastId).Take(lastPageItems).ToListAsync();
        }
        else
        {
            items = await efQuery.OrderByDescending(t => t.Id).Where(t => t.Id < firstId).Take(lastPageItems).ToListAsync();
            items = items.Reverse();
        }
    }
    // 其它情况:使用 偏移分页(Offset pagination)方式
    else
    {
        items = await efQuery.OrderBy(t => t.Id).Skip((options.PageIndex - 1) * options.PageItems).Take(options.PageItems).ToListAsync();
    }
    lastPageIndex = options.PageIndex;
    lastPageItems = options.PageItems;
    firstId = items.First().Id;
    lastId = items.Last().Id;

    return await Task.FromResult(new QueryData() { Items = items, TotalCount = efQuery.Count(), IsSorted = true, IsFiltered = true, IsSearch = true });
}

你可能感兴趣的:(EF,Core,#,Blazor,Web,App,bootstrap,.net,web,app)