随笔 - 705  文章 - 0  评论 - 1103  阅读 - 138万 

使用 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);
            }
        }
 
结果如下:
 
 
image 
posted on   冯瑞涛  阅读(6191)  评论(1编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示