C# LINQ查询方法 C#如何使用LINQ查询数据-C#.Net教程

LINQ 查询关键在于正确区分 IEnumerable 与 IQueryable、合理选用 Where/First/Single 及其 OrDefault 变体、避免 N+1 查询、按场景选择查询表达式或方法语法,并警惕延迟执行陷阱如重复 Count() 调用。

LINQ 查询不是“用不用”的问题,而是“怎么用对、用稳、用得明白”的问题。它本质是一套统一的查询语法和方法集,核心在于理解 IEnumerable 和 IQueryable 的区别,以及何时该用方法语法、何时该用查询表达式。

什么时候该用 Where 而不是 First 或 Single

这是最常混淆的起点:三者都做筛选,但语义和异常行为完全不同。

  • Where 返回所有匹配项(IEnumerable),安全、可链式调用,适合后续继续处理
  • First 返回第一个匹配项,没找到抛 InvalidOperationException;加 OrDefault 版本(FirstOrDefault)则返回 default(T)(如 null 或 0)
  • Single 要求**有且仅有一个**匹配项,多于一个或零个都抛异常;SingleOrDefault 仅在零个时返回默认值,多个仍报错

典型误用:用 Single 查用户列表中邮箱匹配的记录——一旦数据库有脏数据(重复邮箱),线上直接崩溃。应优先用 FirstOrDefault,再显式判断是否为 null。

IQueryable 和 IEnumerable 混用导致 N+1 查询

EF Core / NHibernate 等 ORM 中,IQueryable 是“可翻译的表达式树”,而 IEnumerable 是“内存集合”。一旦调用 ToList()、ToArray() 或任何强制执行的方法,查询就落地了。

  • 错误写法:
    var users = context.Users.ToList(); // 已加载全部用户到内存
    var activeOrders = users.Where(u => u.IsActive).SelectMany(u => u.Orders).ToList(); // N+1:每用户查一次 Orders
  • 正确写法:
    var activeOrders = context.Users
        .Where(u => u.IsActive)
        .SelectMany(u => u.Orders)
        .ToList(); // 整个表达式由 EF 转成一条 SQL

关键判断点:看变量声明类型。如果变量是 IQueryable,且没被中间调用过 AsEnumerable() 或强制执行方法,那它还在“可翻译”状态。

夏夕资源网专注于CMS网站模板,主流语言整站网站源码下载,网站建设相关教程分享,好用的软件素材整合下载,提供一站式便捷自助服务。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"zy.lucklyus.top",如遇到无法解压的请联系管理员!
夏夕资源网-网站模板_免费源码_资源素材 » C# LINQ查询方法 C#如何使用LINQ查询数据-C#.Net教程
在线时间:12:00 - 22:00
关注微信公众号:微信公众号
站长邮箱:[email protected]
  • 运营天数: 1391+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 3996241+
  • 本周更新: 0+
  • 最后更新: 2026-03-16

本站指数

×
  • 运营天数: 1391+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 3996241+
  • 本周更新: 0+
  • 最后更新: 2026-03-16