优化数据库返回数据排序逻辑:替代switch语句的最优方案
优化数据排序逻辑的几种实用方案
你当前使用switch实现的排序逻辑确实存在冗余,尤其是新增排序规则时需要修改分支代码,以下几种方案可以优化这个问题:
1. 字典映射(简洁易维护)
将排序字符串与对应的排序委托映射到字典中,通过键值查找替代分支判断,代码更扁平化,新增规则只需添加字典项:
// 定义排序规则映射 var sortMappings = new Dictionary<string, Func<IQueryable<Book>, IQueryable<Book>>> { ["title"] = books => books.OrderBy(b => b.Title), ["novelti_asc"] = books => books.OrderBy(b => b.Date), ["novelti_des"] = books => books.OrderByDescending(b => b.Date) }; // 应用排序,默认按Title排序 books = sortMappings.TryGetValue(sort, out var sortFunc) ? sortFunc(books) : books.OrderBy(b => b.Title);
2. 扩展方法+Switch表达式(优雅解耦)
用C# 8.0的switch表达式替代传统switch,并封装成扩展方法,把排序逻辑从控制器中抽离,提升代码可读性和复用性:
// 扩展方法封装排序逻辑 public static class QueryableSortExtensions { public static IQueryable<Book> SortBy(this IQueryable<Book> books, string sort) { return sort switch { "title" => books.OrderBy(b => b.Title), "novelti_asc" => books.OrderBy(b => b.Date), "novelti_des" => books.OrderByDescending(b => b.Date), _ => books.OrderBy(b => b.Title) }; } } // 控制器中直接调用 books = books.SortBy(sort);
3. 策略模式(复杂场景首选)
如果后续会有大量复杂排序规则,或者需要动态扩展排序逻辑,策略模式是更合适的选择,每个排序规则对应一个独立类,符合单一职责原则:
定义策略接口与实现类
public interface IBookSortStrategy { IQueryable<Book> ApplySort(IQueryable<Book> books); string SortKey { get; } } public class TitleSortStrategy : IBookSortStrategy { public string SortKey => "title"; public IQueryable<Book> ApplySort(IQueryable<Book> books) => books.OrderBy(b => b.Title); } public class NoveltyAscSortStrategy : IBookSortStrategy { public string SortKey => "novelti_asc"; public IQueryable<Book> ApplySort(IQueryable<Book> books) => books.OrderBy(b => b.Date); } public class NoveltyDescSortStrategy : IBookSortStrategy { public string SortKey => "novelti_des"; public IQueryable<Book> ApplySort(IQueryable<Book> books) => books.OrderByDescending(b => b.Date); }
控制器中使用策略
// 通过依赖注入获取所有排序策略 private readonly IEnumerable<IBookSortStrategy> _sortStrategies; public BookController(IEnumerable<IBookSortStrategy> sortStrategies) { _sortStrategies = sortStrategies; } // 应用排序逻辑 var strategy = _sortStrategies.FirstOrDefault(s => s.SortKey == sort) ?? new TitleSortStrategy(); books = strategy.ApplySort(books);
方案选择建议
- 简单场景(排序规则少、逻辑简单):优先选字典映射或扩展方法+Switch表达式,代码简洁易实现;
- 复杂场景(排序规则多、逻辑复杂或需要动态扩展):选策略模式,便于维护和扩展。
内容的提问来源于stack exchange,提问作者JackFord
相关产品推荐
相关产品推荐

