如何将Entity Framework的Sum查询修改为可等待(Awaitable)形式?
实现异步Sum查询的修改方案
首先修正原代码的语法错误:原查询中Where条件的括号未闭合,正确的同步写法应为:
myClassTwo.TotalAmount = _context.MyClassOne .Where(p => p.id == 1) .Sum(x => x.Amount);
要改为异步可等待的调用,只需做以下两点修改:
- 使用EF Core提供的异步聚合方法
SumAsync替代同步的Sum - 在调用前添加
await关键字,同时确保所在方法标记为async
修改后的完整代码示例:
using Microsoft.EntityFrameworkCore; // 需引入此命名空间才能使用SumAsync public class MyClassOne { public int id { get; set; } public decimal Amount { get; set; } } public class MyClassTwo { public decimal TotalAmount { get; set; } } // 所在方法需标记为async,返回类型为Task或Task<T> public async Task CalculateTotalAsync() { MyClassTwo myClassTwo = new MyClassTwo(); myClassTwo.TotalAmount = await _context.MyClassOne .Where(p => p.id == 1) .SumAsync(x => x.Amount); }
关键说明
SumAsync是EF Core为IQueryable提供的异步扩展方法,会将查询异步发送到数据库执行,避免阻塞主线程- 包含
await的方法必须声明为async,且返回类型需对应为Task(无返回值)或Task<T>(有返回值) - 若需要处理空序列的情况,可使用重载版本指定默认值:
await _context.MyClassOne.Where(...).SumAsync(x => (decimal?)x.Amount) ?? 0;
内容的提问来源于stack exchange,提问作者Diomedes
相关产品推荐
相关产品推荐

