如何使用LINQ对连接后的表中PiValue列求和?
在ASP.NET Core Web API的GetReport接口中计算LINQ连接结果的Value总和
完整实现示例
假设你的DbContext中包含BTBPending和ProformaInvoice两个DbSet,以下是在GetReport接口中完成连接、筛选并计算总和的代码:
方法语法实现
[HttpGet("GetReport")] public IActionResult GetReport(int year, int month) { var totalValue = _context.BTBPending .Join( _context.ProformaInvoice, btb => btb.ContractListId, pi => pi.ContractListId, (btb, pi) => new { btb.PiValue, btb.CountryListId, btb.StatusListId, btb.CreationDate } ) .Where(result => result.CreationDate.Year == year && result.CreationDate.Month == month && result.CountryListId == 26 && new[] {12, 13, 14}.Contains(result.StatusListId) ) .Sum(result => result.PiValue ?? 0); // 处理PiValue可能为null的情况 return Ok(new { TotalValue = totalValue }); }
查询语法实现
如果你更习惯LINQ查询语法,也可以这样写:
[HttpGet("GetReport")] public IActionResult GetReport(int year, int month) { var query = from btb in _context.BTBPending join pi in _context.ProformaInvoice on btb.ContractListId equals pi.ContractListId where btb.CreationDate.Year == year && btb.CreationDate.Month == month && btb.CountryListId == 26 && (btb.StatusListId == 12 || btb.StatusListId == 13 || btb.StatusListId == 14) select btb.PiValue; var totalValue = query.Sum(v => v ?? 0); return Ok(new { TotalValue = totalValue }); }
关键说明
- 内连接逻辑:通过
ContractListId将两个表关联,确保只返回同时存在于两个表中的记录 - 筛选条件:
- 匹配指定的年份和月份(假设你用
CreationDate字段判断时间,可根据实际字段调整) - 限定
CountryListId为26 - 筛选
StatusListId为12、13或14的记录
- 匹配指定的年份和月份(假设你用
- 总和计算:使用
Sum方法对PiValue求和,通过?? 0处理字段可能为null的情况,避免出现NullReferenceException - 返回结果:将计算得到的总和包装成匿名对象,以JSON格式返回
内容的提问来源于stack exchange,提问作者Masum Rayhan
相关产品推荐
相关产品推荐

