C# LINQ查询表达式8大子句详解与实战代码

Ruby
Ruby
发布时间:2026-10-14 | 5人浏览过
原创

C# LINQ提供了类似SQL的声明式查询语法。本文将深入解析LINQ查询表达式中的8个关键子句:from、where、select、group、into、orderby、let以及join,并通过完整的C#代码演示如何在集合操作中实现高效的数据筛选、聚合、排序与关联。

LINQ查询基础与数据源

LINQ(Language Integrated Query)将查询功能直接集成到C#语言中,其最大特点是查询变量可支持匿名类型,从而在多数场景下无需显式指定变量类型。LINQ的数据源极为灵活,既可以是数据库对象或XML流,也可以是任何实现了 IEnumerable<T> 接口的泛型集合或传统集合对象。

第1步:定义from子句——确立查询范围

目的:任何LINQ查询都必须以 from 子句开始,用于声明范围变量并绑定数据源。
操作要点:
- 单个from子句:最常见形式。如遍历字符串数组并用 IndexOf 过滤:

var value = from v in values
where v.IndexOf("LINQ") > -1
select new { v, v.Length };

- 复合from子句**:处理嵌套数据结构(如 List>)。需对内部集合再次使用 from,且内层循环变量作用域仅限于当前查询语句:
var query2 = from gust in gList2
from tel in gust.TelTable
select gust;

- 多数据源from**:可在一个查询中对不同数据源多次声明 from 变量进行交叉匹配。

第2步:使用where子句——精确数据过滤

目的:根据布尔表达式从数据源中提取符合条件的元素。可以出现多次,逻辑关系默认为“与”。
操作要点:
- 内置逻辑符**:注意LINQ使用 && 和 || 而非SQL中的 AND/OR。
- 调用自定义函数:可以直接在 where 中调用静态方法来构建复杂的谓词:

var query2 = from GustInfo gust in gList
where gust.Name.Length > 5 && Check(gust.Name)
select gust;

- 动态黑名单**:利用集合的 Contains 方法实现动态规则判断:
var query3 = from guest in gList
where !names.Contains(guest.Name)
select guest;

第3步:通过select子句——转换结果形态

目的:决定最终返回的元素类型或其表现形式(投影)。
操作要点:
- 对象投影**:可以使用 new { ... } 构造匿名对象,提取特定字段:

select new { Name = guest.Name.Replace("&", "mm"), Age = guest.Age };

- 实例化新对象**:可调用外部构造函数生成强类型对象:
select new MyGustInfo { Name = gust.Name + "My", Age = gust.Age + 1 };

第4步:应用group子句——执行数据分组

目的:按指定的键值将元素划分为组序列,返回类型为 IGrouping<TKey, TElement>。
操作要点:
- 基于属性分组**:按姓名字段首字母提取分组键:

group guest by guest.Name.Substring(0, 1)

- 基于逻辑表达式分组**:也可使用布尔结果作为分组依据(区分年龄是否大于20岁)。遍历结果时需嵌套两层循环,外层访问 Key,内层访问所属元素:

第5步:引入into子句——延长链式查询

目的:将前一步骤(如group或select)的结果赋值给临时标识符,以便继续对该结果执行 orderby 等操作。
操作要点:
- 连接group后排序**:分组后需要按键降序排列时,必须用 into 接收:

... group guest by ... into grguest
orderby grguest.Key descending
select grguest;

第6步:实施orderby与thenby——多级排序控制

目的:指定结果的先后顺序。
操作要点:
- 默认排序**:ascending 是默认方向;
- 多列排序**:逗号分隔即可实现主次排序条件:

orderby guest.Age descending , guest.Name.Length ascending

第7步:借助let子句——缓存中间计算状态

目的**:存储子表达式的计算结果(如截取字符串的首位字符),避免在后续 where 或 select 中重复计算。
操作要点:

let g = guest.Name.Substring(0, 1)
此变量 g 仅在当前行有效。虽然可以省略 let 直接在 where 中写表达式,但使用 let 能显著提升长查询的可读性。

第8步:运用join子句——跨集合关联匹配

目的**:当两个数据源的对应属性相等时,将它们进行内连接或外连接。
操作要点:
- 内连接**:使用 equals 关键字而非双等号进行匹配:

join title in titleList on guest.Name equals title.Name

- 左外连接**:结合 into 接收关联结果,并使用 DefaultIfEmpty() 为无匹配项填充空值:
... into tgroup
from subtitle in tgroup.DefaultIfEmpty()
select new { Title = subtitle == null ? "空缺" : subtitle.Title };

以上就是C# LINQ查询表达式8大关键字的详细使用说明,涵盖了从基础遍历到复杂跨表连接的核心应用场景,更多关于C#编程优化的资料请关注本站其它相关文章!
相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表