如何在Entity Framework中调用带参数存储过程?@aa未声明报错如何解决?
报错原因
- Entity Framework的
SqlQuery方法传入裸值参数时,默认按顺序匹配SQL语句中的@p0、@p1格式的占位符,你直接在SQL中写@aa没有对应参数绑定规则,EF无法识别将22赋值给@aa,因此抛出变量未声明的错误。 - 如果你使用的是EF Core版本,原生的
Database.SqlQuery方法已被废弃,参数规则发生变化也会触发该报错。
解决方案
方案1:显式声明SqlParameter绑定参数
直接指定参数名和对应的值,适配所有EF版本:
// 注意将<返回值类型>替换为你查询结果对应的实际类型,比如返回int就写<int> var result = context.Database.SqlQuery<返回值类型>("GetResultsForCampaign @aa", new SqlParameter("@aa", 22)).ToList();
方案2:使用顺序占位符传参
不需要手动创建SqlParameter对象,按参数顺序用@p{N}格式占位即可:
var result = context.Database.SqlQuery<返回值类型>("GetResultsForCampaign @p0", 22).ToList();
如果有多个参数,依次使用@p0、@p1、@p2对应你传入的第1、2、3个参数即可。
方案3(EF Core适用):使用FromSqlRaw方法
EF Core中已弃用Database.SqlQuery,改用FromSqlRaw调用存储过程:
var result = context.xyz.FromSqlRaw("EXEC GetResultsForCampaign @aa", new SqlParameter("@aa", 22)).ToList();
内容的提问来源于stack exchange,提问作者amit
相关产品推荐
相关产品推荐

