当前位置: 首页 > 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 查询、实现条件筛选、自定义查询逻辑等高级技巧。

http://www.lryc.cn/news/572336.html

相关文章:

  • 实时输出subprocess.Popen运行程序的日志
  • 永磁同步电机无速度算法--基于正切函数锁相环的滑模观测器
  • 【鸿蒙HarmonyOS Next App实战开发】​​​​ArkUI纯色图生成器
  • VACM 详解:SNMPv3 的访问控制核心
  • 回溯----8.N皇后
  • C++ std::set的用法
  • 根据图片理解maven
  • FocalAD论文阅读
  • SpringBoot 应用开发核心分层架构与实战详解
  • SpringBoot电脑商城项目--修改默认收货地址
  • 计算机网络:(四)物理层的基本概念,数据通信的基础知识,物理层下面的传输媒体
  • Mac电脑-Office 2024 长期支持版(Excel、Word、PPT)
  • 【数据破茧成蝶】企业数据标准:AI时代的智能罗盘与增长基石
  • 探索大语言模型(LLM):Lora vs. QLora:参数高效微调的双生花,你该选谁?
  • 协作式机器人助力提高生产速度和效益
  • Java泛型详解与阿里FastJSON源码中的巧妙运用
  • 生成式 AI 的发展方向,应当是 Chat 还是 Agent?
  • 华为OD机试-MELON的难题-DFS(JAVA 2025A卷)
  • 【QT】TXT电子书语音朗读器开发
  • 《Whisper :说明书 》
  • 智能家居HA篇 二、配置Home Assistant并实现外部访问
  • Kafka存储设计深度剖析:日志、索引与文件管理的底层奥秘
  • 【Dify 案例】【自然语言转SQL案例】【三】【工具】【自然语言转SQL】
  • 14.7 LangChain三阶训练法:揭秘智能阅读系统如何用动态难度调节实现92%题目准确率
  • 使用springboot实现过滤敏感词功能
  • Linux文件I/O系统调用深度解析
  • C++ 面向对象特性详解:继承机制
  • 【AI作画】第2章comfy ui的一般输入节点,文本框的类型和输入形式
  • F接口基础.go
  • P2066 机器分配