ASP.NET MVC5 用户管理:分页查询与动态排序优化
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() });
```
通过这种方式,代码更具有扩展性和可维护性,使得在添加新的排序选项时更为简便,同时降低了对底层代码的影响。
2023-05-16 上传
2021-01-21 上传
点击了解资源详情
2018-04-25 上传
2020-10-21 上传
2023-05-16 上传
2018-06-29 上传
2018-07-05 上传
2009-12-17 上传
weixin_38733382
- 粉丝: 3
- 资源: 880
最新资源
- 火炬连体网络在MNIST的2D嵌入实现示例
- Angular插件增强Application Insights JavaScript SDK功能
- 实时三维重建:InfiniTAM的ros驱动应用
- Spring与Mybatis整合的配置与实践
- Vozy前端技术测试深入体验与模板参考
- React应用实现语音转文字功能介绍
- PHPMailer-6.6.4: PHP邮件收发类库的详细介绍
- Felineboard:为猫主人设计的交互式仪表板
- PGRFileManager:功能强大的开源Ajax文件管理器
- Pytest-Html定制测试报告与源代码封装教程
- Angular开发与部署指南:从创建到测试
- BASIC-BINARY-IPC系统:进程间通信的非阻塞接口
- LTK3D: Common Lisp中的基础3D图形实现
- Timer-Counter-Lister:官方源代码及更新发布
- Galaxia REST API:面向地球问题的解决方案
- Node.js模块:随机动物实例教程与源码解析