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

如何优化从三张数据库表提取去重年份的C# LINQ代码?

嘿,这个需求很好优化!你的原代码逻辑没问题,但确实可以用LINQ的链式调用把它压缩得更简洁,同时还能保持可读性。

方案一:用Concat合并后一次性去重

这种写法最直接,把三个表的年份查询直接连起来,最后只做一次全局去重,省去所有中间列表变量:

var distinctYears = db.TableOne.Select(x => x.DateTakenRT.Year)
    .Concat(db.TableTwo.Select(x => x.DateTakenPIC.Year))
    .Concat(db.TableThree.Select(x => x.DateTakenMT.Year))
    .Distinct()
    .ToList();

它的逻辑和你原代码完全一致,但不需要创建allYears这类中间集合,代码更紧凑。如果是用EF Core这类ORM,这种写法还能生成更高效的SQL——一次性从三个表拉取年份数据,再做全局去重,减少数据库查询次数。

方案二:用Union自动处理去重

如果你更倾向和原代码逻辑完全对齐(先给每个表单独去重,再合并去重),可以用Union操作符,它本身就会自动对合并的结果去重,甚至不需要最后再调用Distinct():

var distinctYears = Enumerable.Empty<int>()
    .Union(db.TableOne.Select(x => x.DateTakenRT.Year).Distinct())
    .Union(db.TableTwo.Select(x => x.DateTakenPIC.Year).Distinct())
    .Union(db.TableThree.Select(x => x.DateTakenMT.Year).Distinct())
    .ToList();

这种写法的好处是逻辑分层清晰,每个Union都明确表示“合并一个表的去重年份”,可读性也很强。

小提醒

如果你的DateTakenRT/DateTakenPIC/DateTakenMT这些日期属性有可能为null,记得加上空值判断,比如:

.Select(x => x.DateTakenRT?.Year).Where(y => y.HasValue).Select(y => y.Value)

避免出现空引用异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:57:05