ASP.NET Core 分页和过滤

问题描述 投票:0回答:2

我有一个带有

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 过滤在一个地方,而不是每次都担心丢失其中一个过滤器。

如果上述选项均无效,我怎样才能以最好的方式做到这一点?

c# asp.net-core pagination filtering
2个回答
2
投票

您可以利用实体框架延迟评估。例如:

// 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();

0
投票

@DavidG 如果filterWord 是一个字符串数组,如何应用过滤器

© www.soinside.com 2019 - 2024. All rights reserved.