使用join子句可以根据特定的条件合并两个数据源,但之前要获得两个要连接的列表。在一级方程式比赛中,有赛车手冠军和车队冠军。赛车手从GetChampions()方法中返回,车队从GetConstructorChampions()方法中返回。现在要获得一个年份列表,列出每年的赛车手冠军和车队冠军。
为此,先定义两个查询,用于查询赛车手和车队:
static void InnerJoin()
{
var racers = from r in Formula1.GetChampions()
from y in r.Years
select new {
Year = y,
nameof= r.FirstName + " " + r.LastName
};
var teams = from t in Formula1.GetConstructorChampions()
from y in t.Years
select new {
Year = y,
Name = t.Name
};
}
有了这两个查询,在通过join子句,根据赛车手获得冠军的年份和车队获得冠军的年份进行连接。select子句定义了一个新的匿名类型,它包含Year、Racer和Team属性。
var racersAndTeams = (from r in racers
join t in teams on r.Year equals t.Year
select new {
Year = r.Year,
Champion = r.Name,
Contructor = t.Name
}).Take(10);
System.Console.WriteLine("Year World Champion Contructor Title");
foreach(var item in racersAndTeams)
{
System.Console.WriteLine($"{item.Year}: {item.Champion,-10} {item.Constructor}");
}
当然,也可以把它们合并为一个LINQ查询,但这只是一种个人