如何用LINQ筛选TFS中最后构建时间为2015年的唯一项目?
解决方案
没问题,我来帮你搞定这个需求!核心思路是先按项目分组,找到每个项目的最新构建记录,再筛选出最新构建时间在2015年及更早的项目,最后提取这些唯一的项目即可。
步骤拆解
- 按项目分组:把所有构建记录按所属项目归类,每个组对应一个项目的完整构建历史。
- 获取每个项目的最新构建:对每个项目组,找出
FinishTime最晚的那条构建记录。 - 筛选符合条件的项目:判断该最新构建的年份是否小于2016(即2015年及更早)。
- 提取唯一项目:把符合条件的项目提取出来,得到最终的唯一项目列表。
代码实现
根据你使用的.NET版本,有两种简洁的写法:
1. .NET 6+ 版本(推荐,使用MaxBy方法)
MaxBy是.NET 6新增的方法,可以直接从集合中取指定字段最大的元素,代码更简洁直观:
var oldProjects = builds // 先过滤掉未完成的构建(避免空引用异常,有些构建可能还在运行中) .Where(b => b.FinishTime != null) // 按项目分组,每组包含该项目的所有构建记录 .GroupBy(b => b.Project) // 对每个组,取最新的构建记录,并关联对应的项目 .Select(group => new { Project = group.Key, LatestBuild = group.MaxBy(b => b.FinishTime.Value) }) // 筛选最新构建时间在2015年及更早的项目 .Where(x => x.LatestBuild.FinishTime.Value.Year < 2016) // 提取项目对象 .Select(x => x.Project) .ToList();
2. 旧版.NET(比如.NET Framework)
如果你的环境不支持MaxBy,可以用OrderByDescending+First来模拟获取最新构建:
var oldProjects = builds .Where(b => b.FinishTime != null) .GroupBy(b => b.Project) .Select(group => new { Project = group.Key, LatestBuild = group.OrderByDescending(b => b.FinishTime.Value).First() }) .Where(x => x.LatestBuild.FinishTime.Value.Year < 2016) .Select(x => x.Project) .ToList();
注意事项
- 务必先过滤
FinishTime为null的构建记录,避免空引用异常——毕竟有些构建可能还在运行中,没有完成时间。 - 如果你的
Build类中是用项目ID而非项目对象标识归属,只需把GroupBy(b => b.Project)改成GroupBy(b => b.ProjectId),后续提取项目时对应调整即可。
内容的提问来源于stack exchange,提问作者doorman
相关产品推荐
相关产品推荐

