ASP.NET MVC5 用户管理:分页查询与动态排序优化

0 下载量 98 浏览量 更新于2024-07-15 收藏 527KB PDF 举报
在ASP.NET MVC5网站开发过程中,关于用户添加和浏览功能的实现,特别是在数据存储层的设计上,遇到了处理分页查询及排序的挑战。具体来说,开发者在编写`FindPageList`方法时,遇到了如何处理不同类型排序需求的问题。这个方法接受一个`Expression<Func<T, TKey>> order`参数,用于指定排序依据,其中`TKey`是泛型类型,可能是`int`(如用户ID)或`DateTime`(如注册时间)。 原始代码中,为了适应不同排序需求,使用了`switch`语句硬编码了针对每种排序类型的条件。例如,对于ID排序,如果是升序,就使用`u => u.UserID`作为表达式;如果是降序,则添加`false`表示降序排列。同样,对于注册时间排序,分别对应升序和降序。这种做法虽然可以解决当前问题,但并不优雅,因为它没有充分利用C#的泛型和表达式功能,而且当需要增加更多排序选项时,代码会变得冗长且难以维护。 更好的解决方案应该是将排序类型抽象出来,创建一个枚举或策略接口,这样在业务逻辑层可以更清晰地定义排序规则,而数据访问层可以接收通用的排序表达式。例如,可以创建一个名为`SortOrder`的枚举,包含`IdAscending`、`IdDescending`、`RegTimeAscending`和`RegTimeDescending`等选项。然后在业务逻辑层,根据用户选择的排序类型(如`SortOrder.IdDescending`),动态构造相应的`Expression<Func<T, TKey>>`。 下面是改进后的代码示例: ```csharp public enum SortOrder { IdAscending = 0, IdDescending = 1, RegTimeAscending = 2, RegTimeDescending = 3 } public class UserRepository { public IEnumerable<T> FindPageList<TKey>(int pageSize, int pageIndex, out int totalNumber, Expression<Func<T, bool>> where, Func<T, TKey, SortOrder, bool> sortOrderSelector) { // ... switch (sortOrder) { case SortOrder.IdAscending: _users.Items = Repository.FindPageList(pageSize, pageIndex, out_totalNumber, _where, u => u.UserID, sortOrderSelector); break; case SortOrder.IdDescending: _users.Items = Repository.FindPageList(pageSize, pageIndex, out_totalNumber, _where, u => u.UserID, (u, _) => !sortOrderSelector(u, u.UserID)); break; // 类似的其他排序情况 } } } // 在业务逻辑层 var sortOrder = SortOrder.IdDescending; _users.Items = UserRepository.FindPageList(pageSize, pageIndex, out_totalNumber, _where, sortOrderSelector: (u, key) => key == null ? false : key.Value.CompareTo(sortOrder switch { SortOrder.IdAscending => 1, SortOrder.IdDescending => -1, _ => throw new NotSupportedException() }); ``` 通过这种方式,代码更具有扩展性和可维护性,使得在添加新的排序选项时更为简便,同时降低了对底层代码的影响。