LINQ 标准的查询操作符 连接 join in on equals

使用 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);
            }
        }
 
结果如下:
 
 
 
LINQ核心操作符深度解析:集合运算、Zip对齐、转换固化与生成器 LINQ是C#中实现函数式查询的核心能力,其本质是基于IEnumerable<T>的延迟执行表达式管道。理解Concat/Union等集合运算符的关系代数语义、Zip的位置同步机制、ToArray/ToDictionary等转换方法的立即求值特性,以及Empty/Range等生成器的惰性构造原理,是掌握.NET数据处理范式的基石。这些操作符直面类型协变边界、泛型运行时行为、内存分配策略等底层工程问题,在EF Core查询优化、高并发数据对齐、缓存策略设计等真实场景中决定系统稳定性与性能表现。本文聚焦LINQ 阅读详情

相关推荐

C# DataTable内存分组汇总:从基础循环到LINQ与性能优化

在数据处理与业务开发中,内存数据分组与聚合是常见且核心的操作,尤其在无法直接依赖数据库查询的场景下。其原理通常基于哈希表(如Dictionary)构建分组容器,通过遍历数据行、提取分组键、执行聚合计算(如Sum、Average)来完成。这一技术对于实现离线报表生成、多源数据整合及实时分析具有重要价值,能显著提升应用的数据处理能力与灵活性。在C#生态中,DataTable作为承载结构化数据的经典容器,其原生缺乏GroupBy支持成为许多开发者的痛点。本文聚焦DataTable内存分组,深入探讨手工循环、LIN

aodiyi6351的博客 419

EF框架知识点梳理

1.架构开发初步 https://www.cnblogs.com/zhoufangcheng04050227/p/10245669.html

Yann_nnaY的博客 1240

Pytorch CIFAR10图像分类 EfficientNet v1篇

EfficientNet源自Google Brain的论文EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks. 从标题也可以看出,这篇论文最主要的创新点是. 论文提出了,混合缩放,把网络缩放的三种方式:深度、宽度、分辨率,组合起来按照一定规则缩放,从而提高网络的效果。EfficientNet在网络变大时效果提升明显,把精度上限进一步提升,成为了当前最强网络。

风信子的猫Redamancy的快乐星球 1807

C#编程 LINQ查询

LINQ查询表达式 约束 LINQ查询表达式必须以from子句开头,以select或group子句结束 关键字 from...in...:指定要查找的数据以及范围变量,多个from子句则表示从多个数据源查找数据。注意:C#编译器会把"复合from子句"的查询表达式转换为SelectMany()扩展方法 join...in...on...equals...:指定多个数据源的...

diaosong8043的博客 379

C#学习相关系列之Linq用法---group和join相关用法(三)

本文介绍了C#中linq的group和join的相关用法

qiaodahua的博客 3536

LINQjoin

一、表设计 部门表tab_Department: DepartmentID DepartmentName 1 生产部 2 市场部 3 项目部 人员表tab_person: personID personName DepartmentID 1 张三 1 2 李四 2 3 王五 3 打卡表tab_clock: clockID clockTime personID 1 2022-0

D_lunar的博客 1387

LinQ 标准查询操作符 连接 join in on equals

LinQ 标准查询操作符 连接 join in on equals 转载于:https://www.cnblogs.com/doubleyan/archive/2011/04/02/2003055.html

weixin_30477797的博客 293

LinqLinq to Object

在Enumerable类,针对IEnumerable数据,指的是内存数据 Linq 其实就是把对数据操作的通用部分完成,把可变的交给委托,使用者只用关心可变部分,其实Linq就是这么一个封装,但确实很好用. 我们通过反编译就能能清晰的看出 WHERE Where:把对数据过滤的通用操作完成,把可变的过滤逻辑交给委托 Where是限制操作符,它将过滤标准应用在序列上,按照...

dianchanchan1786的博客 162

Linq to sql用法解析---join

说明:实例是以Northwind数据库为准       目的:两个表连接,筛选出每个customer所对应的订单数量(两个方法) 用join关联两张表,这也是很自然的一个方法 var v = from u in entities.Customers join n in entities.Orders on u.Custome

脚踏实地 3395

LINQ查询语法与方法语法深度解析:从SQL式声明到函数式编程实践

在.NET开发中,数据查询是核心操作之一。LINQ(Language Integrated Query)作为C#的语言集成查询技术,提供了两种等效但风格迥异的查询方式:查询语法(Query Syntax)与方法语法(Method Syntax)。查询语法采用类似SQL的声明式结构,使用from、where、select等关键字,直观描述数据筛选、连接与分组意图,尤其适合处理复杂的多表关联和分组聚合场景,其代码形态与SQL语句高度对应,降低了数据库开发者的学习门槛。方法语法则基于扩展方法和Lambda表达式,

weixin_33971977的博客 353

LINQ核心技术解析与性能优化实战

LINQ(Language Integrated Query)是C#中的革命性数据查询技术,通过统一的语法实现多数据源操作。其核心原理是将命令式查询转换为声明式表达式树,在编译时进行类型检查并支持智能提示。技术价值体现在提升开发效率、减少代码量以及优化查询性能上,特别适用于数据库访问、集合处理和XML操作等场景。延迟执行和表达式树机制使LINQ能智能优化查询计划,而GroupBy、Join操作符为复杂数据分析提供强大支持。在实际工程中,合理使用Include预加载、分页查询和参数化查询等技巧,能有效解决N

weixin_33754065的博客 444

LINQ技术详解C#》-2.查询表达式翻译为标准查询操作符

(1)透明标识符 有些翻译步骤要使用透明标识符(*)插入枚举变量。 透明标识符只在翻译过程中存在,翻译结束将不再出现。 (2)翻译步骤 ①带有into连续语句的Select和Group语句 from...into... -> from i in from ... ...

weixin_30586257的博客 159

Linq学习之旅——LINQ查询表达式

目录 1. 概述 2. from子句 3. where子句 4. select子句 5. group子句 6. into子句 7. 排序子句 8. let子句 9. join子句 10. 小结 1. 概述 LINQ的全称是Language Integrated Query,中文译成“语言集成查询”。LINQ作为一种查询技术,首先要解决数据源的封装,大致使用了...

weixin_30243533的博客 154

JinqStream 实战教程:10 个示例掌握 Java 流式查询的艺术

JinqStream 是 Java 8 中一款强大的 LINQ 风格查询工具,它扩展了标准 Stream API,提供更简洁、更直观的数据查询体验。无论是集合操作还是数据库查询,JinqStream 都能让你的代码更加优雅高效。本文将通过 10 个实用示例,带你快速掌握 JinqStream 的核心用法,提升数据处理能力。 ## 一、快速创建流:从集合到 JinqStream JinqStre

gitblog_00069的博客 718

Jinq 核心功能全解析:从 Lambda 表达式到 SQL 自动生成的魔法

Jinq 是一款为 Java 8 设计的 LINQ 风格查询工具,它让开发者能够以自然的方式编写数据库查询,将数据库数据视为集合中的普通 Java 对象,通过标准 Java 命令进行过滤和迭代,所有代码会自动转换为优化的数据库查询。 ## 🌟 什么是 Jinq? Jinq 提供了一种简单直观的方式,让开发者可以使用 Java 8 的 Lambda 表达式来编写数据库查询。它的核心思想是将数据

gitblog_00727的博客 679

【Unity】【2D】用连续图片生成动画Animation的简明步骤

本文介绍了Unity中使用2D连续图片制作2D动画Animation的简明步骤。

O青草O的博客 Unity和游戏制作知识分享 651

管家婆SQL数据字典.doc

管家婆SQL数据字典.doc

上一篇: LINQ 标准的查询操作符 分组 group by into 、select new 、orderby descending、from in
下一篇: LINQ 标准的查询操作符 设置操作符号 两个结果集的 并、交、差、唯一
finemoon
博客等级 码龄18年 10粉丝 3原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值