实现动态过滤和排序的分页功能

在处理复杂的数据查询时,经常需要实现过滤、排序以及分页功能。本文将介绍如何使用Entity Framework Paginate这个开源的.NET库来简化这些操作,并且展示如何用更少的代码实现更多的功能。

什么是Entity FrameworkPaginate?

Entity FrameworkPaginate是一个为.NET应用程序设计的插件,它通过存储过滤和排序表达式及其执行条件,简化了动态排序和过滤的操作。根据这些信息,它决定对基础查询应用哪些过滤和排序,并返回一个包含所有分页数据所需信息的Page对象。

主要类介绍

在使用Entity FrameworkPaginate时,有三个主要的类需要了解:

  • Page
  • Filters
  • Sorts

Entity Framework Paginate提供了一个Page类,它包含了分页数据所需的所有信息。例如,如果想要对Employee实体进行分页,EF Paginate将提供一个Page对象,它包含以下属性:

  • CurrentPage:存储当前页码的整数变量。
  • PageCount:存储查询可用的总页数的整数变量。
  • PageSize:存储每页显示记录数的整数值。
  • RecordCount:查询可用的总记录数。
  • Results:返回IEnumerable,包含实际的结果集。

Filters类提供了一个Add方法,它接受两个参数:条件和表达式。条件是一个布尔值,决定是否执行给定的表达式。要实现动态过滤,需要初始化一个filters对象,然后添加多个条件及其对应的表达式。

var filters = new Filters<Employee>(); filters.Add(!string.IsNullOrEmpty(searchText), x => x.LoginID.Contains(searchText)); filters.Add(!string.IsNullOrEmpty(jobTitle), x => x.JobTitle.Equals(jobTitle));

类似于filters类,sorts类也提供了一个Add方法,它有一个额外的参数byDescending。byDescending参数默认为false,只有在需要按降序排序记录时才需要发送true。

var sorts = new Sorts<Employee>(); sorts.Add(sortBy == 1, x => x.BusinessEntityID); sorts.Add(sortBy == 2, x => x.LoginID, true); sorts.Add(sortBy == 3, x => x.JobTitle);

如何实现分页、过滤和排序

要获取最终的分页、过滤和排序数据,有一个扩展方法Paginate,它作用于IQueryable类型。所需要做的就是在基础查询上调用这个paginate扩展方法,并传递页码、页面大小以及可选的sorts和filters对象。

context.Employees.Paginate(currentPage, pageSize, sorts, filters);

实际应用示例

在GetFilteredEmployees函数中,传递页面大小、当前页、搜索文本、排序方式和职位标题作为参数。这些参数可以来自任何尝试使用此功能的组件。在案例中,它来自前端,其中包含这些选项。页面大小和当前页决定需要返回的页面以及其中包含的记录数。如果传递了搜索文本,则需要过滤登录ID,排序方式是一个整数值,决定要实现哪种排序,职位标题则根据提供的标题过滤employee表。

public Page<Employee> GetFilteredEmployees(int pageSize, int currentPage, string searchText, int sortBy, string jobTitle) { Page<Employee> employees; var filters = new Filters<Employee>(); var sorts = new Sorts<Employee>(); filters.Add(!string.IsNullOrEmpty(searchText), x => x.LoginID.Contains(searchText)); filters.Add(!string.IsNullOrEmpty(jobTitle), x => x.JobTitle.Equals(jobTitle)); sorts.Add(sortBy == 1, x => x.BusinessEntityID); sorts.Add(sortBy == 2, x => x.LoginID); sorts.Add(sortBy == 3, x => x.JobTitle); using (var context = new AdventureWorksEntities()) { employees = context.Employees.Paginate(currentPage, pageSize, sorts, filters); } return employees; }
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485