C#怎么使用EF Core的Include加载_C#关联数据懒加载和预加载【常用】

穿越時空

穿越時空

2026-05-19

457人浏览

原创

theninclude用于在include基础上链式加载多级导航属性,必须作用于实体导航属性而非标量字段,且需避免与select混用导致静默失效;正确写法如.include(x => x.posts).theninclude(x => x.author).theninclude(x => x.profile)。

c#怎么使用ef core的include加载_c#关联数据懒加载和预加载【常用】

Include 不是“开了就能用”的开关,它只在查询执行前、且未被 LINQ 操作破坏的 IQueryable 上生效。写错位置、混用投影、路径不合法,都会导致它静默失效——你看到数据在,但背后是 N+1 查询。

Include 后接 Select 就大概率失效

这是最隐蔽也最常踩的坑:你以为写了 Include 就万事大吉,结果循环里访问 order.Customer.Name 还是触发额外 SQL。

  • Include 只绑定到当前 IQueryable 实例;一旦调用 Select(尤其是映射到匿名类型或 DTO),EF Core 会丢弃所有未显式出现在 Select 中的导航属性
  • EF Core 6+ 会尝试自动 JOIN,但仅限于简单投影(如 Select(x => x)Select(x => new { x.Id, x.Customer }));若写成 Select(x => new { x.Id, x.Customer.Name }),Customer 实体本身没被选中,Include 彻底作废
  • 验证方法:开启日志 options.LogTo(Console.WriteLine),盯住生成的 SQL —— 是一条带 JOIN 的语句,还是先查主表、再为每个实例发一条子查询?

ThenInclude 只能点导航属性,不能点字段

报错 InvalidOperationException: The expression 'x => x.Address.City' is not a valid member access expression,基本就是你在 ThenInclude 里点了标量字段。

C函数速查手册(CHM版)
C函数速查手册(CHM版)

C函数速查手册(CHM版)

下载
  • ThenInclude 的参数必须是导航属性(即类型为另一个实体或集合的属性),比如 Address 可以,Citystring)不行
  • 如果 Address 类里定义的是 public string CityName { get; set; },那 ThenInclude(a => a.CityName) 非法;必须确保下一级仍是实体,例如 Address.Province(类型为 Province)才可继续 ThenInclude
  • 别混用字符串路径和 Lambda:Include("Customer").ThenInclude("Address") 在 EF Core 6+ 已废弃,运行时可能静默失败或抛异常,统一用 Include(x => x.Customer).ThenInclude(x => x.Address)

多级嵌套建议拆开写,别硬链

三层以上(如 Order → Customer → Address → Province)强行写成一行 Include(...).ThenInclude(...).ThenInclude(...) 容易断在某一级,调试困难。

  • 拆成多个 Include + ThenInclude 组合更稳定:Include(o => o.Customer).ThenInclude(c => c.Address)Include(o => o.Customer).ThenInclude(c => c.Province) 是合法且等效的
  • 这样写的好处:每级可单独注释、可逐行注释掉测试、SQL 日志也更容易对应到哪一级漏了
  • EF Core 会自动合并 JOIN,不会因为拆开就多发 SQL;性能无损,可维护性显著提升

AsSplitQuery 不是 Include 的平替

AsSplitQuery 解决的是「一对多 + 多对一混合导致的笛卡尔积膨胀」,不是所有 N+1 场景都适用。

  • 它只在配合 Include 时生效,单独调用无效
  • 适用于主表少量记录 + 关联数据量大(如 1 个 Blog 带 1000 篇 Posts)的场景;若主表本身就有上万条,拆成多个查询反而加重数据库压力
  • 不支持某些数据库提供程序(如 SQLite),且无法与 DistinctGroupBy 等操作共存
真正难的不是写对语法,而是判断「这一层到底需不需要加载」——Include 加得少,运行时 N+1;加得多,SQL 膨胀、内存飙升、网络传输变慢。每次加之前,先问自己:这个导航属性接下来是否真会被读取?有没有更轻量的 Select 投影能替代?

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c#

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1103

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

2002

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1163

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

8402

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

1428

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

1482

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

859

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

530

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1061

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
前端开发(基础+实战项目合集)
前端开发(基础+实战项目合集)

共60课时 | 5.7万人学习

第十九期_前端开发
第十九期_前端开发

共111课时 | 17.2万人学习

第十七期_前端开发
第十七期_前端开发

共60课时 | 9.2万人学习