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

EntityFramework调用Last()引发System.NotSupportedException问题求助

解决Entity Framework中使用Last()抛出NotSupportedException的问题

问题原因

Entity Framework的LINQ to Entities不支持Last()和LastOrDefault()方法,因为无法将这两个方法转换为对应的SQL语句——SQL中没有直接获取结果集最后一条记录的原生语法,因此会抛出System.NotSupportedException。

你提到调试时card值为null,实际是因为异常被catch块捕获后,card变量未被正确赋值就进入了错误分支;如果没有匹配数据,Last()会直接抛出InvalidOperationException而非返回null。

解决方法

将OrderBy()配合Last()的写法,替换为OrderByDescending()配合First()或FirstOrDefault()——这是EF能正确转换为SQL的写法,逻辑上等价于获取排序后的最后一条记录。

关键注意点

如果cardID不是唯一字段,仅按cardID排序无法确定记录的先后顺序,建议使用唯一且能体现时序的字段(比如主键ID、创建时间CreateTime等)来排序,确保拿到的是你期望的"最后一条"记录。

修改后的代码示例

[HttpPost]
public ActionResult AddReport(entradas_saidas es)
{
    using (EMSistec bd = new EMSistec())
    {
        try
        {
            // 改用OrderByDescending + FirstOrDefault,替换原有的OrderBy + Last
            // 这里假设用主键Id作为排序依据,确保拿到最新的同cardID记录
            var card = bd.entradas_saidas
                         .Where(e => e.cardID == es.cardID)
                         .OrderByDescending(e => e.Id)
                         .FirstOrDefault();

            // 可选:处理没有找到匹配记录的情况
            if (card == null)
            {
                return Json(new { msg = "NO_RECORD_FOUND" }, JsonRequestBehavior.AllowGet);
            }

            bd.entradas_saidas.Add(es);
            bd.SaveChanges();

            return Json(new { msg = "SUCCESS" }, JsonRequestBehavior.AllowGet);
        } 
        catch (Exception) 
        {
            return Json(new { msg = "ERROR" }, JsonRequestBehavior.AllowGet);
        }
    }
}

补充说明

  • 使用FirstOrDefault()而非First(),可以避免当没有匹配记录时抛出InvalidOperationException,而是返回null,方便后续做空值判断。
  • 排序字段的选择要贴合业务逻辑:如果需要按记录创建时间取最新的,就替换为OrderByDescending(e => e.CreateTime)。

内容的提问来源于stack exchange,提问作者NewbieProgrammer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 16:31:02