使用 join 子句可以根据特定的条件合并两个数据源,但之前要获得两个要连接的列表。
在一级方程式比 赛中,设有赛手冠军和制造商冠军。
赛手从GetChampions()方法中返回,制造商从GetConstructorChampions() 方法中返回。
现在要获得一个年份列表,列出每年的赛手和制造商冠军。
为此,先定义两个查询,用于查询赛手和制造商团队:
车手集合结构:
new Racer()
{
FirstName = "Michael",
LastName = "Schumacher",
Country = "Germany",
Starts = 250,
Wins = 91,
Years = new int[] { 1994, 1995, 2000, 2001, 2002, 2003, 2004 }, //冠军年
Cars = new string[] { "Benetton", "Ferrari" }
}
制造商集合结构:
new Team()
{
Name = "Ferrari",
Years = new int[] { 1961, 1964, 1975, 1976, 1977, 1979, 1982, 1983, 1999, 2000, 2001, 2002, 2003, 2004, 2007 } //冠军年
}
private static void Join() { var racers = from r in Formula1.GetChampions() from y in r.Years //获得车手中的年份集合 where y > 2003 //判断年份 select new { Year = y, Name = r.FirstName + " " + r.LastName }; //匿名对象定义,年份和名字是集合 var teams = from t in Formula1.GetContructorChampions() from y in t.Years where y > 2003 select new { Year = y, Name = t.Name }; //获得冠军年集合及制造商名字
有了这两个查询,再通过子句join t in teams on r.Year equals t.Year,根据赛手获得冠军的年份和制造商获得冠军的年份进行连接。
var racersAndTeams = from r in racers join t in teams on r.Year equals t.Year //和SQL的形式完全一样 select new { Year = r.Year, Racer = r.Name, Team = t.Name };
//select 子句定义了一个新的匿名类型,它包含Year、Racer 和Team 属性。 Console.WriteLine("Year Champion Constructor Title"); foreach (var item in racersAndTeams) { Console.WriteLine("{0}: {1,-20} {2}", item.Year, item.Racer, item.Team); } } 当然,也可以把它们合并为一个LINQ 查询,但这只是一种尝试:
private static void Join() { int year = 2003; var racersAndTeams = from r in from r1 in Formula1.GetChampions() from yr in r1.Years where yr > year select new { Year = yr, Name = r1.FirstName + " " + r1.LastName } join t in from t1 in Formula1.GetContructorChampions() from yt in t1.Years where yt > year select new { Year = yt, Name = t1.Name } on r.Year equals t.Year select new { Year = r.Year, Racer = r.Name, Team = t.Name }; Console.WriteLine("Year Champion Constructor Title"); foreach (var item in racersAndTeams) { Console.WriteLine("{0}: {1,-20} {2}", item.Year, item.Racer, item.Team); } }
结果如下:
冯瑞涛
分类:
[01] .Net X
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?