EF Core:同时执行多个Where查询

4
我正在尝试寻找EF Core中读取多个表数据的最佳实践,同时最小化由于与数据库的往返而产生的性能损失。最好有一个像Redis中管道的功能,可以将查询排队,从而在一次往返中执行它们,但我想这在SQL中不可能实现。我确实希望能够异步发送所有查询,以便它们可以同时执行,所以我很惊讶地发现DBContext不支持多个并发查询。因此,给定这种情况,EF Core中从多个表中获取数据的最佳实践是什么,以避免等待多个连续的往返到DB服务器?

你可以使用多个禁用更改跟踪的 DbContext 实例发送多个查询。然而,通常情况下,你的应用程序有很多用户发送查询,所以为每个用户并发发送多个查询并不是一种改进。 - David Browne - Microsoft
1个回答

11

免责声明:我是项目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上查看是否执行了两次。

日志显示两次是因为第一次需要生成查询(使用拦截器并记录查询,即使未执行),第二次查询被记录是因为它现在被执行了。


我想知道使用ExecuteStrategy和beginTransaction有什么不同?我可以看到连接只在两个查询都执行完之后才被打开和关闭。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接