多条件OrderBy排序逻辑实现问题:房产经纪人列表网格排序需求
C# 多条件排序实现方案
注意你原有代码中
GetAgents方法的返回值存在笔误,你需要返回经纪人列表,建议修改为async Task<List<AgentResultDto>>。
实现逻辑说明
- 无用户指定排序列时,走默认三级排序规则:
NumberofActiveListings降序→NumberofSoldAndExpiredListings降序→AgentName升序 - 用户指定排序列时,优先按用户选择的列排序,同值场景走默认兜底规则,保证排序结果的确定性
代码实现(无反射、性能最优版)
直接用switch匹配排序列,避免反射带来的性能损耗和安全风险,代码如下:
public class GridviewInput { public string SortingColumn { get; set; } // 可扩展排序方向字段,按需新增 // public bool IsAscending { get; set; } //other params } public virtual async Task<List<AgentResultDto>> GetAgents(GridviewInput model) { List<AgentResultDto> agents = new List<AgentResultDto>(); // 原有填充经纪人列表的业务逻辑 IOrderedEnumerable<AgentResultDto> sortedAgents; // 优先判断是否存在用户指定的排序列 if (!string.IsNullOrWhiteSpace(model.SortingColumn)) { // 匹配用户选择的排序列作为第一排序维度 sortedAgents = model.SortingColumn.Trim() switch { nameof(AgentResultDto.AgentId) => agents.OrderBy(a => a.AgentId), nameof(AgentResultDto.AgentName) => agents.OrderBy(a => a.AgentName), nameof(AgentResultDto.NumberofActiveListings) => agents.OrderByDescending(a => a.NumberofActiveListings), nameof(AgentResultDto.NumberofSoldAndExpiredListings) => agents.OrderByDescending(a => a.NumberofSoldAndExpiredListings), // 未知列 fallback 到默认第一排序规则 _ => agents.OrderByDescending(a => a.NumberofActiveListings) }; // 追加兜底排序规则,同值场景按规则排序 sortedAgents = sortedAgents .ThenByDescending(a => a.NumberofSoldAndExpiredListings) .ThenBy(a => a.AgentName); } else { // 无指定排序列时走默认三级排序 sortedAgents = agents .OrderByDescending(a => a.NumberofActiveListings) .ThenByDescending(a => a.NumberofSoldAndExpiredListings) .ThenBy(a => a.AgentName); } agents = sortedAgents.ToList(); return agents; }
扩展说明
如果需要支持用户自定义排序方向(升序/降序),可以给GridviewInput新增IsAscending布尔字段,在switch分支中判断使用OrderBy还是OrderByDescending即可。
如果排序列后续会频繁新增不想维护switch分支,也可以通过表达式树构建动态排序逻辑,不过性能略低于硬编码实现。
内容的提问来源于stack exchange,提问作者I Love Stackoverflow
相关产品推荐
相关产品推荐

