使用 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 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?