EF6使用SqlQuery / ExecuteSqlCommand调用存储过程而不考虑参数顺序?

时间:2017-03-17 11:34:38

标签: entity-framework stored-procedures

我使用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;错误。谢谢你的帮助。

1 个答案:

答案 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());