出于好奇,在EF Core中,从性能角度来看,加载单个实体及其相关数据的更好方法是什么?
急于装载?
Customer customer = await _efContext.Customers
.Include(c => c.ManyContacts)
.Include(c => c.ManyOrders)
.SingleAsync(c => c.CustomerId == customerId);
显式加载?
Customer customer = await _efContext.Customers.FindAsync(customerId);
await _efContext.Entry(customer).Collection(c => c.ManyContacts).LoadAsync();
await _efContext.Entry(customer).Collection(c => c.ManyoOrders).LoadAsync();
或者有更好的方法吗?
Eager/ladzy与此无关,因为完成请求的确切时间仍由您决定。三个请求总是比一个长,所以问题是,需要链接数组的频率有多高。如果每次都需要它们,那么拆分请求绝对没有意义。如果不是。。。好吧,那你需要自己来描述一下。
但性能不应该是你主要关心的问题。在一个请求中加载所有内容更简单、更容易理解。因此,我建议始终使用更简单的解决方案,即使它不是最佳性能。只有在性能太低的情况下,并且只有在分析显示糟糕的SQL是原因的情况下才开始调整和优化。剧透:可能不会。
如果您有EF Core 5,在这些情况下,您可以始终使用热切加载。
这个版本总是在一个查询中加载所有内容,除非您说.AsSplitQuery()
。然后,每个表都加载到一个单独的查询中。
但没有比这更好的办法了。这取决于你的情况。