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

LINQ复杂嵌套Where子句编写:排除符合特定条件的Titolare记录

正确实现代码
var benefici = context.Benefici
    .Include("Titolare")
    .Include("Titolare.ComuneDomicilio")
    .Where(b => 
        // 基础筛选:Titolare未离世
        !b.Titolare.DATA_DECESSO.HasValue
        // 核心排除规则:过滤掉最新记录符合「FASCIA=50且MOTIVO_FINE为00/01」的Titolare所有记录
        && !context.Benefici
            .Where(a => a.Titolare.CODICE == b.Titolare.CODICE)
            // 排序逻辑:无结束时间的记录为最新,其次按结束时间倒序
            .OrderByDescending(a => a.DATA_FINE.HasValue ? 0 : 1)
            .ThenByDescending(a => a.DATA_FINE)
            .Select(latest => latest.FASCIA == 50 && (latest.MOTIVO_FINE == "00" || latest.MOTIVO_FINE == "01"))
            .First()
        // 有效记录筛选:匹配样例输出规则,保留未结束记录、以及同FASCIA下最新的已结束记录
        && (!b.DATA_FINE.HasValue || 
            context.Benefici
                .Where(a => a.Titolare.CODICE == b.Titolare.CODICE && a.FASCIA == b.FASCIA)
                .OrderByDescending(a => a.DATA_FINE.HasValue ? 0 : 1)
                .ThenByDescending(a => a.DATA_FINE)
                .First().CODICE == b.CODICE)
    )
    .OrderBy(b => b.Titolare.COGNOME)
    .ThenBy(b => b.Titolare.NOME)
    .ThenBy(b => b.Titolare.DATA_NASCITA)
    .ThenBy(b => b.CODICE)
    .ToList();

若存在Titolare无关联Benefici的场景,可将代码中的First()替换为FirstOrDefault()并补充空值判断,避免运行时异常。

原代码问题说明
  • 排序逻辑错误:未将DATA_FINE为NULL的记录判定为最新记录,导致取到的最新记录不符合实际业务规则
  • 筛选逻辑混淆:将单条记录的字段判断和Titolare级别的全量排除规则混写,不符合「排除符合条件的Titolare所有关联记录」的需求
  • 语法错误:Where条件末尾多了未闭合的&&符号,直接导致编译不通过
样例匹配验证
  • 1002的最新记录为2021-01-01的FASCIA=50、MOTIVO_FINE=01,符合排除规则,所有1002的记录均被过滤
  • 1004无有效未结束记录,因此不出现在输出中
  • 1003最新记录为未结束的FASCIA=30记录,不符合排除规则,因此保留其未结束记录和最新的FASCIA=50有效记录
  • 1000、1001均不符合排除规则,保留对应有效未结束记录,与样例输出完全匹配

内容的提问来源于stack exchange,提问作者sara

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 18:06:02