EF Core 6:仅用于筛选时是否需要使用Include方法?
关于EF中筛选关联实体是否需要Include的问题
这个问题确实很基础但容易被新手忽略,我来给你掰扯清楚:
结论:完全不需要添加Include语句,你的第一段代码就能正确返回所有包含标题为空的Post的Blog。
为什么不需要Include?
EF的LINQ查询在处理Where里的b.Posts.Any(p => p.Title == String.Empty)时,会自动把这个条件转换成SQL的关联查询逻辑(通常是EXISTS子查询或者JOIN),不管你有没有写Include,这个筛选逻辑都会正常生效。
Include的唯一作用是:告诉EF在加载Blog实体的同时,把关联的Posts数据也一起加载到内存中,方便后续直接访问blog.Posts。而你的需求只是筛选出符合条件的Blog,完全不需要返回Posts数据,所以Include在这里不仅多余,还会额外加载不必要的关联数据,反而拖慢查询性能。
两段代码的区别
- 第一段代码生成的SQL只会查询Blog表的字段,并用
EXISTS检查是否存在标题为空的Post,返回的Blog对象里Posts属性是未加载的(懒加载开启的话会在你访问时才加载,但你不需要的话完全没必要)。
var badBlogs = context.Blogs .Where(b => b.Posts.Any(p => p.Title == String.Empty));
- 第二段代码虽然也能得到正确的Blog,但会同时把对应的Posts数据加载出来,如果你后续根本不会用到这些Posts,那就是纯粹的资源浪费。
var badBlogs = context.Blogs .Include(b => b.Posts) // 这里的Include完全没必要 .Where(b => b.Posts.Any(p => p.Title == String.Empty));
什么时候才需要Include?
只有当你需要在查询结果中直接访问Blog对应的Posts数据时,才需要添加Include。比如你要筛选出符合条件的Blog,并且要遍历每个Blog的Posts做后续操作,这时候Include才有意义。
内容的提问来源于stack exchange,提问作者jeancallisti
相关产品推荐
相关产品推荐

