我使用EF 6 SqlQuery / ExecuteSqlCommand来调用存储过程,如下所示:
var parameters = new List<SqlParameter>()
{
new SqlParameter("@ID", model.ID),
new SqlParameter("@Email", model.Email),
new SqlParameter("@Phone", model.Phone)
};
using (var context = new MyContext())
{
context.Database.ExecuteSqlCommand("sp_MySproc_U @ID, @Email, @Phone", parameters.ToArray());
}
这很有效,直到我意识到我的电子邮件值被保存到我的电话字段,反之亦然。为什么?因为我的存储过程中的参数顺序是@ ID,@ Phone,@ Email,这显然与我的代码中的参数顺序不匹配。在SqlQuery / ExecuteSqlCommand语法中是否有一种简单的方法来专门命名参数并将它们与值匹配。我的目标是调用我的存储过程,而不关心与存储过程中的顺序匹配的代码中的参数顺序。
this post中有人建议如下,
db.Database.SqlQuery<resultClass>("mySpName PageNumber=@PageNumber,Code=@Code,PageSize=@PageSize", parameters.ToArray()).ToList();
但是这会返回&#34;无效字符&#39; =&#39;&#34;错误。谢谢你的帮助。
答案 0 :(得分:1)
根据SQL Server stored procedure call syntax,命名参数必须以符号@ 开头,即
@parameter=value
或
@parameter=@variable
所以你可以使用
context.Database.ExecuteSqlCommand(
"sp_MySproc_U @ID=@ID, @Email=@Email, @Phone\@Phone",
parameters.ToArray());
或更一般地
context.Database.ExecuteSqlCommand(
"sp_MySproc_U " + string.Join(", ", parameters.Select(p => p.Name + "=" + p.Name)),
parameters.ToArray());