当前位置: 首页 > news >正文

跟着AI学习C# Day22

📅 Day 22:LINQ(Language Integrated Query)

✅ 学习目标:

  • 理解什么是 LINQ,及其在 C# 中的作用;
  • 掌握使用 LINQ 查询语法(Query Syntax)方法语法(Method Syntax)
  • 熟悉常用 LINQ 操作符(如 WhereSelectOrderByGroupBy 等);
  • 能够对集合、数组、数据库、XML 进行查询操作;
  • 理解延迟执行和立即执行的区别;
  • 编写一个完整的 LINQ 示例程序,如学生管理系统查询模块;
  • 初步了解 LINQ to SQL / Entity Framework 的应用场景。

🧠 一、什么是 LINQ?

LINQ(Language Integrated Query) 是 C# 提供的一种统一的查询语言,它将数据查询集成到 C# 语言中,使得你可以用类似 SQL 的方式来查询各种数据源(如集合、数据库、XML 等)。

主要优点:

特性描述
类型安全在编译时检查错误
可读性强使用声明式语法,代码更清晰
统一查询模型支持多种数据源(内存对象、SQL、XML 等)

🔁 二、LINQ 的两种语法风格

1. 查询语法(Query Syntax)—— 类似 SQL

var query = from item in collectionwhere item.Property > 10select item;

2. 方法语法(Method Syntax)—— 使用 Lambda 表达式

var query = collection.Where(item => item.Property > 10);

✅ 实际上两者是等价的,编译器会把查询语法转换为方法语法。


🧩 三、常见 LINQ 操作符

操作符功能
Where过滤元素
Select投影(映射)
OrderBy / OrderByDescending排序
ThenBy / ThenByDescending多字段排序
GroupBy分组
Join内连接
GroupJoin分组连接
Distinct去重
Skip / Take分页
First / FirstOrDefault获取第一个元素
Single / SingleOrDefault获取唯一元素
Count / Sum / Average / Min / Max聚合操作

🧱 四、基本 LINQ 示例

List<int> numbers = new List<int> { 1, 2, 3, 4, 5, 6 };// 查询语法
var evenNumbersQuery = from n in numberswhere n % 2 == 0select n;// 方法语法
var evenNumbersMethod = numbers.Where(n => n % 2 == 0);foreach (var num in evenNumbersQuery)
{Console.WriteLine(num);
}

🔄 五、延迟执行 vs 立即执行

✅ 延迟执行(Deferred Execution)

大多数 LINQ 操作符不会立即执行,而是等到你遍历结果(如 foreach)时才真正执行。

var query = numbers.Where(n => n > 3); // 此时尚未执行
numbers.Add(10);                        // 修改原集合
foreach (var n in query)               // 此时执行,包含新值Console.WriteLine(n);

✅ 立即执行(Immediate Execution)

某些方法会在调用时立即执行并返回结果:

方法说明
ToList()返回 List<T>
ToArray()返回数组
ToDictionary()返回字典
Count()返回数量
First() / Last()获取单个元素

💡 六、LINQ 查询复杂对象示例

class Student
{public int Id { get; set; }public string Name { get; set; }public int Score { get; set; }
}List<Student> students = new List<Student>
{new Student { Id = 1, Name = "张三", Score = 85 },new Student { Id = 2, Name = "李四", Score = 92 },new Student { Id = 3, Name = "王五", Score = 78 },
};// 查询语法
var topStudents = from s in studentswhere s.Score >= 90orderby s.Name descendingselect s;// 方法语法
var topStudentsMethod = students.Where(s => s.Score >= 90).OrderByDescending(s => s.Name);foreach (var student in topStudents)
{Console.WriteLine($"{student.Id} - {student.Name} : {student.Score}");
}

🧪 七、分组查询(GroupBy)

var grouped = from s in studentsgroup s by s.Score / 10 into gorderby g.Key descendingselect new { Grade = g.Key * 10, Students = g };foreach (var group in grouped)
{Console.WriteLine($"分数段:{group.Grade}-{group.Grade + 9}");foreach (var student in group.Students){Console.WriteLine("  " + student.Name);}
}

🔗 八、LINQ Join 示例(内连接)

class Order
{public int Id { get; set; }public int StudentId { get; set; }public decimal Amount { get; set; }
}List<Order> orders = new List<Order>
{new Order { Id = 1, StudentId = 1, Amount = 100 },new Order { Id = 2, StudentId = 2, Amount = 200 },
};// 查询语法
var query = from s in studentsjoin o in orders on s.Id equals o.StudentIdselect new { s.Name, o.Amount };// 方法语法
var method = students.Join(orders,s => s.Id,o => o.StudentId,(s, o) => new { s.Name, o.Amount });foreach (var item in query)
{Console.WriteLine($"{item.Name} - {item.Amount}");
}

🧮 九、聚合函数(Aggregation)

int count = students.Count();
decimal total = orders.Sum(o => o.Amount);
decimal average = orders.Average(o => o.Amount);
Student topStudent = students.OrderByDescending(s => s.Score).First();

📝 十、LINQ to Objects、LINQ to SQL、LINQ to XML

LINQ 类型数据源用途
LINQ to Objects集合、数组内存中查询
LINQ to SQLSQL Server 数据库简单 ORM
LINQ to EntitiesEntity FrameworkORM 扩展
LINQ to XMLXML 文档XML 解析/生成

💪 实战练习:学生信息查询系统

功能要求:

  • 定义 Student 类,包含姓名、年龄、成绩;
  • 创建多个学生对象;
  • 实现以下功能:
    • 查询所有及格的学生;
    • 查询最高分和平均分;
    • 按成绩降序排列输出;
    • 将结果保存为列表或数组。
示例代码:
class Program
{static void Main(){List<Student> students = new List<Student>{new Student { Name = "张三", Age = 20, Score = 88 },new Student { Name = "李四", Age = 22, Score = 95 },new Student { Name = "王五", Age = 21, Score = 70 },new Student { Name = "赵六", Age = 19, Score = 65 },};var passed = students.Where(s => s.Score >= 60);var topScore = students.Max(s => s.Score);var avgScore = students.Average(s => s.Score);var sorted = students.OrderByDescending(s => s.Score);Console.WriteLine("及格学生:");foreach (var s in passed){Console.WriteLine($"{s.Name} - {s.Score}");}Console.WriteLine($"\n最高分:{topScore}");Console.WriteLine($"平均分:{avgScore:F2}");Console.WriteLine("\n按成绩排序:");foreach (var s in sorted){Console.WriteLine($"{s.Name} - {s.Score}");}}
}class Student
{public string Name { get; set; }public int Age { get; set; }public int Score { get; set; }
}

📝 小结

今天你学会了:

  • 什么是 LINQ,它在 C# 中的作用;
  • 掌握了 LINQ 的两种语法风格(查询语法 & 方法语法);
  • 熟悉了常见的 LINQ 操作符(如 Where、Select、OrderBy、GroupBy、Join);
  • 理解了延迟执行与立即执行的区别;
  • 编写了多个 LINQ 示例,包括查询、排序、分组、连接等;
  • 初步了解了 LINQ to SQL 和 LINQ to XML 的应用场景。

LINQ 是现代 C# 开发中不可或缺的工具之一,掌握它可以显著提升你在处理集合、数据库、XML 等数据源时的效率和代码可读性。


🧩 下一步学习方向(Day 23)

明天我们将进入一个新的主题 —— 表达式树(Expression Trees)与动态查询构建,你将学会如何使用表达式树构建动态 LINQ 查询、实现条件筛选、自定义查询逻辑等高级技巧。

相关文章:

  • [Data Pipeline] MinIO存储(数据湖) | 数据层 Bronze/Silver/Gold
  • 【深度学习】条件随机场(CRF)深度解析:原理、应用与前沿
  • Linux运维新人自用笔记(用虚拟机Ubuntu部署lamp环境,搭建WordPress博客)
  • 微信小程序使用rsa 加解密
  • Ubuntu Server设置locale
  • 6.19_JAVA_微服务
  • 主成分分析(PCA)例题——给定协方差矩阵
  • naive-ui-2.28.3 离线文档
  • Oracle 数据库性能优化之重做日志(redo)
  • MySQL基础函数
  • [Data Pipeline] Airflow DAG | 数据质量检查PyDeequ
  • Linux 并发编程:从线程池到单例模式的深度实践
  • android 省市区联动选择
  • Kafka性能调优全攻略:从JVM参数到系统优化
  • Angular--Hello(TODO)
  • 基于C#的Baumer相机二次开发教程
  • 主流防火墙策略绕过漏洞的修复方案与加固实践
  • 宽度优先遍历(bfs)(2)——fllodfill算法
  • QLoRA (Quantized Low-Rank Adaptation)浅析
  • 火山引擎项亮:机器学习与智能推荐平台多云部署解决方案正式发布
  • 代加工接订单网站/优化关键词具体要怎么做
  • 怎么做熊掌号网站/网站竞价推广
  • 织梦做仿站时 为何会发生本地地址跳转网站地址/北京网站seo服务
  • 手机wap网站怎样从微信公众号打开/中牟网络推广
  • 山东家居行业网站开发/网络舆情监测平台
  • 南宁中庭装饰公司电话/东莞百度搜索优化