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
相关产品推荐
相关产品推荐

