ASP.NET MVC执行Sum聚合操作时新用户无数据报错如何解决
问题描述
积分榜单功能逻辑:用户产生交易时,积分值关联用户ID存入积分记录表。当前故障表现:积分表内有数据的老用户可正常计算积分总和,新注册用户因积分表无对应记录触发报错。
涉及业务代码:
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Web; using System.Web.Mvc; using ProjectTiklaKazan.Models.Sınıf; namespace ProjectTiklaKazan.Controllers { [Authorize] public class AnaMenuController : Controller { Context c = new Context(); // GET: AnaMenu public ActionResult Index() { Users u = Session["UserID"] as Users; var toptohum = c.PuanBilgis.Where(x => x.UserID == u.UserID).Sum(x => x.PuanMiktar).ToString(); if (toptohum !=null) { TempData["toptohum"] = toptohum; } else { TempData["toptohum"] = 0; } return View(); } } }
故障原因
Linq to Entities的Sum()方法对非空值类型字段求和时,如果筛选后的源序列为空,会直接抛出InvalidOperationException异常。原有逻辑里的toptohum != null判断永远不会触发:
- 异常发生在
Sum()执行阶段,还没走到赋值和判断逻辑 - 值类型的
Sum()返回结果是非空值类型,调用ToString()后得到的字符串也不可能为null,原有空判断逻辑本身就无效。
修复方案
求和时先将字段转为对应可空值类型,空序列求和会返回null,再通过GetValueOrDefault()给默认值0即可,不会触发异常。修正后的核心代码:
public ActionResult Index() { Users u = Session["UserID"] as Users; int? totalScore = c.PuanBilgis .Where(x => x.UserID == u.UserID) .Sum(x => (int?)x.PuanMiktar); TempData["toptohum"] = totalScore.GetValueOrDefault().ToString(); return View(); }
额外优化点:数据库上下文Context为非托管资源,建议通过using语句包裹使用,或重写控制器Dispose方法手动释放,避免数据库连接泄漏。
内容的提问来源于stack exchange,提问作者Selman Altuğ
相关产品推荐
相关产品推荐

