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

C#:LINQ学习笔记01:LINQ基础概念

一、LINQ 架构体系

1. LINQ 的核心思想

  • 统一查询模型:对对象、XML、数据库等不同数据源使用一致的语法
  • 强类型检查:编译时类型安全,减少运行时错误。

2. 核心组件

技术数据源典型场景
LINQ to Objects内存集合 (IEnumerable)过滤/排序集合数据
LINQ to XMLXML 文档解析/查询 XML 节点
LINQ to SQL关系数据库将查询翻译为 SQL 执行

关键代码示例

// LINQ to Objects
var numbers = new List<int> { 1, 2, 3 };
var query = numbers.Where(n => n > 1);

// LINQ to XML
XDocument doc = XDocument.Load("data.xml");
var elements = doc.Descendants("Book").Where(x => (int)x.Element("Price") > 50);

// LINQ to SQL(伪代码)
var db = new DataContext();
var users = db.Users.Where(u => u.Age > 18);

二、查询表达式 vs 方法语法

1. 本质区别

  • 查询表达式:类 SQL 语法(from...where...select),可读性高。
  • 方法语法:链式调用扩展方法(Where()/Select()),灵活性更强。

2. 转换关系
所有查询表达式会被编译器翻译为方法语法

代码对比

// 查询表达式
var query1 = from num in numbers 
             where num % 2 == 0 
             select num * 2;

// 方法语法
var query2 = numbers
    .Where(num => num % 2 == 0)
    .Select(num => num * 2);

三、IEnumerable 接口解析

1. 核心机制

  • IEnumerable:定义迭代能力(通过 GetEnumerator())。
  • IEnumerator:实现遍历逻辑(MoveNext()Current)。

2. LINQ 的延迟执行

  • 查询定义时不执行,直到迭代结果(如 foreachToList())时才触发。

代码验证延迟执行

var numbers = new List<int> { 1, 2, 3 };
var query = numbers.Select(n => {
    Console.WriteLine($"Processing {n}");
    return n * 2;
});

// 此时无输出
foreach (var num in query) { } // 输出:Processing 1, Processing 2, Processing 3

四、创建首个 LINQ 查询(三步法)

1. 定义数据源

var products = new List<Product> {
    new Product { Name = "Apple", Price = 15 },
    new Product { Name = "Laptop", Price = 5000 },
    new Product { Name = "Book", Price = 80 }
};

2. 编写查询

// 方法语法
var expensiveProducts = products
    .Where(p => p.Price > 100)
    .OrderBy(p => p.Name);

3. 执行查询

foreach (var product in expensiveProducts)
{
    Console.WriteLine(product.Name);
}

五、练习:集合过滤与投影

任务 1:过滤数据

// 数据源
var numbers = Enumerable.Range(1, 100);

// 目标:选出 3 的倍数且大于 50 的数字
var result = numbers.Where(n => n % 3 == 0 && n > 50);

任务 2:投影转换

// 数据源
var persons = new List<Person> { /* 包含姓名和年龄的对象 */ };

// 目标:生成 { Name = "张三", Initial = 'Z' } 形式的新对象
var initials = persons.Select(p => new {
    Name = p.Name,
    Initial = p.Name[0]
});

六、扩展思考
  1. 如何通过 yield return 自定义一个延迟执行的 LINQ 操作?
  2. IQueryableIEnumerable 在查询数据库时的区别?
  3. 如何组合 Where().OrderBy().Select() 实现复杂查询?

相关文章:

  • 品佳诚邀您参加 3/12『英飞凌汽车方案引领智能座舱新纪元』在线研讨会
  • Ubuntu问题 - 在ubuntu上使用 telnet 测试远程的IP:端口是否连通
  • 软考-数据库开发工程师-3.1-数据结构-线性结构
  • 为什么要学习数据结构与算法
  • 修改hosts文件,修改安全属性,建立自己的DNS
  • 如何判断https使用了哪个版本的TLS?
  • 创建 Ubuntu 22.04 USB 启动盘
  • 游戏引擎学习第135天
  • 【RTC】 TM32 RTC(实时时钟)库函数 配置
  • 图生生AI,如何将商品主图的商品替换成自己的商品?
  • CF 452A.Eevee(Java实现)
  • 操作 Redis 常用 shell 脚本
  • 获取哔站评论
  • 【JavaScript — 前端快速入门】 JavaScript 引入方式
  • 全向广播扬声器在油气田中的关键应用 全方位守护安全
  • 充电桩测试负载应用:保障充电安全与性能的核心技术
  • SpringBoot获取YAML配置文件中的属性值(二):使用Environment环境组件读取值
  • 非docker方式部署openwebui过程记录
  • 【MySQL】事务二
  • deepseek助力运维和监控自动化
  • 公司电脑做网站/2021百度热搜年度榜
  • 网站建设做哪 个会计科目/可以免费推广的平台
  • 有代做医学统计图的网站吗/seo优化网站查询
  • 浙江网站建设网/seo常用工具包括
  • 男女做那个能看的视频网站/百度霸屏培训
  • 武汉培训网站建设/如何做平台推广赚钱