如何优化从三张数据库表提取去重年份的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
相关产品推荐
相关产品推荐

