我有一个带有
ASP.NET Core
的 EF Core
应用程序,我正在使用 LINQ
对多个属性进行分页和过滤。List<User> allUsersList = _dbContext.Users
.Where(x => x.FirstName.ToLower().Contains(filterWord.ToLower()) ||
x.LastName.ToLower().Contains(filterWord.ToLower()) ||
x.Email.ToLower().Contains(filterWord.ToLower()))
.ToList();
int totalNumber = allUsersList.Count();
List<User> paginetedItems = allUsersList
.Skip((filter.PageNumber - 1) * filter.PageSize)
.Take(filter.PageSize).ToList();
这种方式的问题是我没有进行实际的服务器端分页。
另一种方法是执行 2 个单独的函数,一个用于获取总计数,另一个用于获取分页项目。
但问题是如何才能将filterWord 过滤在一个地方,而不是每次都担心丢失其中一个过滤器。
如果上述选项均无效,我怎样才能以最好的方式做到这一点?
您可以利用实体框架延迟评估。例如:
// This doesn't actually run a DB query
var userQuery = _dbContext.Users
.Where(x => x.FirstName.ToLower().Contains(filterWord.ToLower()) ||
x.LastName.ToLower().Contains(filterWord.ToLower()) ||
x.Email.ToLower().Contains(filterWord.ToLower()));
// This will run a SELECT COUNT(*) query
int totalNumber = userQuery.Count();
// And finally, this will return the paginated items
List<User> paginetedItems = userQuery
.Skip((filter.PageNumber - 1) * filter.PageSize)
.Take(filter.PageSize)
.ToList();
@DavidG 如果filterWord 是一个字符串数组,如何应用过滤器