EF Core一对多关系:查询指定子项的高效方式对比
EF Core一对多场景下的查询效率对比
场景说明
给定实体定义:
class Author { string Id, ICollection<Book> Books } class Book { string Id, Author AuthorRef, string AuthorRefId }
已知authorId与bookId,需获取对应的Book对象,以下是两种查询方式的效率对比:
两种方式分析
方式1:先查Author再筛选Books
该方式会先执行查询获取指定作者的全部书籍,再在内存中按bookId筛选目标对象。如果作者拥有大量书籍,数据库会返回大量无关数据,不仅增加网络传输成本,还会占用更多内存进行后续筛选,效率极低。即使开启EF Core的立即加载,本质仍是拉取全量书籍,没有优化空间。方式2:直接查询Books集合
使用条件Books.Where(b => b.Id == bookId && b.AuthorRefId == authorId)直接在数据库层面过滤。数据库可利用Book.Id(主键默认有索引)和AuthorRefId的索引(若已创建)快速定位目标记录,仅返回所需的单条数据,传输和处理成本都极低。你担心的“搜索对象数量更多”是误解——数据库查询是基于条件精准匹配,而非全表扫描,实际处理的数据量远小于方式1。
结论
方式2的效率远高于方式1,这是EF Core查询的最佳实践:尽量让数据库完成数据过滤,减少不必要的数据传输与内存处理。
内容的提问来源于stack exchange,提问作者Oyiwai
相关产品推荐
相关产品推荐

