You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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判断永远不会触发:

  1. 异常发生在Sum()执行阶段,还没走到赋值和判断逻辑
  2. 值类型的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ğ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.02 23:39:29