在处理复杂的数据查询时,经常需要实现过滤、排序以及分页功能。本文将介绍如何使用Entity Framework Paginate这个开源的.NET库来简化这些操作,并且展示如何用更少的代码实现更多的功能。
Entity FrameworkPaginate是一个为.NET应用程序设计的插件,它通过存储过滤和排序表达式及其执行条件,简化了动态排序和过滤的操作。根据这些信息,它决定对基础查询应用哪些过滤和排序,并返回一个包含所有分页数据所需信息的Page
在使用Entity FrameworkPaginate时,有三个主要的类需要了解:
Entity Framework Paginate提供了一个Page类,它包含了分页数据所需的所有信息。例如,如果想要对Employee实体进行分页,EF Paginate将提供一个Page
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;
}