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
相关产品推荐
相关产品推荐

