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

为什么Entity Framework仅在返回值被使用时才会执行存储过程调用

问题原因解答

1. 存储过程不执行的根因

Entity Framework 6 中的 SqlQuery<T>() 方法返回的是 DbRawSqlQuery<T> 类型,属于延迟执行的可枚举对象,和普通LINQ to Entities查询逻辑一致:仅定义查询本身不会触发任何数据库操作,只有当你主动枚举结果时,EF才会将命令发送到SQL Server执行。
你碰到的两种表现差异就是有没有触发枚举导致的:

  • 调用 ToList()、First()、Count() 或者用foreach遍历结果时,属于主动枚举操作,会立刻触发存储过程执行
  • 只定义查询不做任何枚举操作,EF只会将其视为待执行的查询定义,不会真的发送请求到数据库

2. CartReturn类字段返回空的原因

EF做结果集到实体的映射时,默认只会映射公共属性,你定义的CartReturn中声明的是公共字段,没有get/set访问器,EF会直接跳过这些字段的赋值,调整为自动属性即可正常拿到返回值:

class CartReturn
{
     public string CartNo { get; set; }
     public string Barcode { get; set; }
     public string Variation { get; set; }
     public string Qty { get; set; }
}

3. 不需要返回值的最优写法

如果你完全不需要接收存储过程的返回结果,可以直接使用ExecuteSqlCommand()方法,这个方法是同步立刻执行的,不需要枚举结果,专门适配无结果集返回的SQL操作/存储过程调用:

db.Database.ExecuteSqlCommand("Scanning_Scan @Id, @SessionId, @Appname, @Barcode, @Username", _params);

该方法会直接返回存储过程影响的行数,不需要额外处理结果即可完成调用,完全符合你的需求。

内容的提问来源于stack exchange,提问作者Ryan D.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 20:15:02