C# List带OR条件排序:OrderFunds列为空时切换排序字段实现
实现方案
方案1:判断所有OrderFunds为null时切换排序列
该方案会先校验OrderFunds列是否全为null,再动态选择排序字段,分两次数据库查询实现,逻辑清晰易读:
// 先构造基础查询条件 var baseQuery = fundSupervisor.List().Where(fund => fund.IsActive); // 校验是否存在非null的OrderFunds值 bool hasValidOrderValue = await baseQuery.AnyAsync(f => f.OrderFunds != null); // 按条件选择排序列 List<Fund> funds = hasValidOrderValue ? await baseQuery.OrderBy(f => f.OrderFunds).ToListAsync() : await baseQuery.OrderBy(f => f.你要替换的目标列名).ToListAsync();
如果希望仅发起一次数据库请求,可以直接在排序逻辑中嵌入条件判断(适配EF Core 3.0+版本):
List<Fund> funds = await fundSupervisor.List() .Where(fund => fund.IsActive) .OrderBy(f => EF.Functions.Case( EF.Functions.Exists(fundSupervisor.List().Where(f2 => f2.IsActive && f2.OrderFunds != null)), f.OrderFunds, f.你要替换的目标列名 )) .ToListAsync();
方案2:支持null值排序(无需切换排序列)
如果不需要切换列,仅需要调整null值的排序优先级(比如null值统一排在最前/最后),可以用二次排序实现:
// 示例:null值排在最后,非null值按OrderFunds正序排列 List<Fund> funds = await fundSupervisor.List() .Where(fund => fund.IsActive) .OrderBy(f => f.OrderFunds == null ? 1 : 0) // 非null值优先级更高,要让null排在前面就把1和0互换 .ThenBy(f => f.OrderFunds) .ToListAsync();
如果是内存中的List排序,只需要把上述异步方法AnyAsync/ToListAsync替换为同步的Any/ToList即可正常使用。
内容的提问来源于stack exchange,提问作者Patrick Juan
相关产品推荐
相关产品推荐

