You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 06:18:00