EF Core复杂查询能否异步执行 服务端GroupBy是否支持异步?
结论
EF Core 中包括服务端 GroupBy 在内的可翻译复杂查询,完全支持异步执行,且异步执行逻辑和简单查询完全一致,不存在默认异步的说法,需要你显式调用异步执行方法触发。
详细说明
关于 GroupBy 的执行逻辑
EF Core 3.0 及以上版本就已经支持将符合SQL分组规范的 GroupBy 操作直接翻译为原生GROUP BY子句在数据库服务端执行,只有无法翻译的分组逻辑才会回退到客户端求值,你观察到的服务端分组效果是符合EF Core设计的。关于复杂查询的异步支持
EF Core 的异步执行能力不区分查询复杂度,只要你的复杂查询(包括服务端分组、多表关联、嵌套子查询等)可以被完整翻译为SQL语句在服务端执行,就可以正常调用异步方法执行。只有当查询存在需要客户端求值的部分时,客户端侧的计算逻辑会走同步流程,和数据库交互的部分依然支持异步。关于异步执行的实现方式
没有默认异步的规则,所有EF Core查询都需要你显式调用异步执行方法才会走异步流程,和查询复杂度无关。你只需要将原来触发查询执行的同步方法,替换为同名的异步方法即可,示例如下:
// 同步执行的分组查询 var syncResult = context.Orders .GroupBy(o => o.CustomerId) .Select(g => new { CustomerId = g.Key, OrderTotal = g.Sum(o => o.Amount) }) .ToList(); // 异步执行的分组查询,仅修改最终执行方法即可 var asyncResult = await context.Orders .GroupBy(o => o.CustomerId) .Select(g => new { CustomerId = g.Key, OrderTotal = g.Sum(o => o.Amount) }) .ToListAsync();
异步执行方法都在 Microsoft.EntityFrameworkCore 命名空间下,你需要先引用该命名空间才能正常调用 ToListAsync、CountAsync、FirstOrDefaultAsync 等异步方法。
内容的提问来源于stack exchange,提问作者user16938158
相关产品推荐
相关产品推荐

