通过 Web API 使用 Entity Framework 进行分页

Pagination using Entity Framework through Web API

我有一个 class 这样的:

public class BE_CategoryBase
{
    public Int32 CategoryID { get; set; }
    public String CategoryName
    {
        get;
        set;
    }
    public String CategorySanitized { get; set; }
    public Boolean IsActive { get; set; }
    public DateTime? ModificationDate { get; protected set; }
    public Int64? ModifiedBy { get; set; }
}

网上API我有这样的操作方法

So far I am fetching all records from the server in single request. The above API call is Post because there are many filters being used. As the Get has limited length in query string...so I used Post.

[Route("api/v1/CategoryList"), HttpPost]
public async Task<IHttpActionResult> CategoryList([FromBody]BE_Category obj)
{
    var result = await _category.CategoryList(obj);

    if (!string.IsNullOrEmpty(result.Key))
        await _log.CreateLog(new BE_Logs { Message = result.Key });

    return Ok(new { ErrorMessage = result.Key, result = result.Value });
}

现在,为了使用 Paging,我正在考虑在 BE_CategoryBase class 中添加 startPagePageSize 列。当我使用 Entity Framework Code First 时,在 class 中添加列也会在数据库 Table 中添加这些列。

有什么优雅的方法可以使用 Post 操作方法实现分页吗?

NotMapped 是我要找的。我希望这一定会对某人有所帮助。

public class Paging
{
    [NotMapped]
    public Int16 StartPage { get; set; }

    [NotMapped]
    public Int16 PageSize { get; set; }
}


public class BE_CategoryBase : Paging
{
    public Int32 CategoryID { get; set; }
    public String CategoryName { get; set; }
    public String CategorySanitized { get; set; }
    public Boolean IsActive { get; set; }
    public DateTime? ModificationDate { get; protected set; }
    public Int64? ModifiedBy { get; set; }
}

处理这种情况的一种简洁方法是将所有结果集和相关元数据(页面大小、当前页码等)封装在一个 class 中。 EntityFrameworkPaginate 是一个 nuget 包,它提供了一个优雅的分页解决方案。因此,它的工作方式是您设置动态过滤和排序,您将获得一个 Page 对象作为结果,该对象将包含结果和元数据。 (CurrentPage、PageCount、PageSize、RecordCount 和结果)。

分页也可能会带有动态过滤和排序。处理这种情况的一种简洁方法是将所有结果集和相关元数据(页面大小、当前页码等)封装在一个 class 中。 EntityFrameworkPaginate 是一个 nuget 包,它提供了一个优雅的分页解决方案。因此,它的工作方式是您设置动态过滤和排序,您将获得一个 Page 对象作为结果,该对象将包含结果和元数据。 (CurrentPage、PageCount、PageSize、RecordCount 和结果)。

如果您有基于单独条件的动态过滤器,那么您可以创建过滤器对象。添加过滤器表达式和条件 filter.Add 中的过滤器 object.The 第一个参数是搜索条件,第二个是搜索表达式。

 var filters = new Filters<BE_CategoryBase>(); 
 filters.Add(!string.IsNullOrEmpty(searchText), x => x.CategoryName.Contains(searchText));
 filters.Add(!string.IsNullOrEmpty(categoryText), x => x.CategorySanitized.Equals(categoryText));

同样在 Sorts 对象中设置动态排序。

 var sorts = new Sorts<BE_CategoryBase>();
 sorts.Add(sortBy == 1, x => x.CategoryID );
 sorts.Add(sortBy == 2, x => x.ModificationDate );

现在,在您的数据库集上调用分页扩展方法以获得分页结果。

 Page<BE_CategoryBase> paginatedResult = context.BE_CategoryBase.Paginate(currentPage, 
                                  pageSize, sorts, filters);

这种方法减少了您必须编写的代码,而且对性能没有任何影响。 link.

中有一个详细示例