在ASP.NET Core中,用EF Core加载单个实体及其相关数据的更好方法是什么



出于好奇,在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()。然后,每个表都加载到一个单独的查询中。

但没有比这更好的办法了。这取决于你的情况。

最新更新