我正在尝试寻找EF Core中读取多个表数据的最佳实践,同时最小化由于与数据库的往返而产生的性能损失。最好有一个像Redis中管道的功能,可以将查询排队,从而在一次往返中执行它们,但我想这在SQL中不可能实现。我确实希望能够异步发送所有查询,以便它们可以同时执行,所以我很惊讶地发现DBContext不支持多个并发查询。因此,给定这种情况,EF Core中从多个表中获取数据的最佳实践是什么,以避免等待多个连续的往返到DB服务器?
免责声明:我是项目Entity Framework Plus的所有者。
EF+ Query Future(免费且开源)使您能够批量执行多个查询并在同一条命令中执行它们。
这样,多个查询只需要进行一次往返即可执行。
示例:
// using Z.EntityFramework.Plus; // Don't forget to include this.
var ctx = new EntitiesContext();
// CREATE a pending list of future queries
var futureCountries = ctx.Countries.Where(x => x.IsActive).Future();
var futureStates = ctx.States.Where(x => x.IsActive).Future();
// TRIGGER all pending queries in one database round trip
// SELECT * FROM Country WHERE IsActive = true;
// SELECT * FROM State WHERE IsActive = true
var countries = futureCountries.ToList();
// futureStates is already resolved and contains the result
var states = futureStates.ToList();
编辑:回复评论
不起作用。日志显示该命令被执行了两次。
在SQL Profiler上查看是否执行了两次。
日志显示两次是因为第一次需要生成查询(使用拦截器并记录查询,即使未执行),第二次查询被记录是因为它现在被执行了。