Sql server 为什么实体框架在更改SqlParameter顺序时引发异常?

Sql server 为什么实体框架在更改SqlParameter顺序时引发异常?,sql-server,entity-framework,Sql Server,Entity Framework,我首先使用entity framework 4.3代码调用存储过程我调用存储过程的方式如下: var parameters = new[] { new SqlParameter("member", 1), **new SqlParameter("Code","0165210662660001"),** new SqlParameter("PageSize", 1), new SqlParameter("PageNumber",1) }; var result

我首先使用entity framework 4.3代码调用存储过程我调用存储过程的方式如下:

var parameters = new[]
{
    new SqlParameter("member", 1),
    **new SqlParameter("Code","0165210662660001"),**
    new SqlParameter("PageSize", 1),
    new SqlParameter("PageNumber",1)
};

var result  = context.Database.SqlQuery<resultClass>(
    "mySpName @member, @Code, @PageSize,@PageNumber" parameters).ToList();
var result  = context.Database.SqlQuery<resultClass>("mySpName @Code,  @member,@PageSize,@PageNumber" parameters).ToList();

var parameters = new[]
{
    **new SqlParameter("Code","0165210662660001"),**
    new SqlParameter("Member", 1),
    new SqlParameter("PageSize", 1),
    new SqlParameter("PageNumber",1)
};
存储过程如下所示:

ALTER PROCEDURE [c].[mySpName]
    @Member INT ,
    @Code VARCHAR (50) ,
    @PageSize INT ,
    @PageNumber INT
 AS 
我为什么要下这个订单? 保持参数有序重要吗? 我该怎么做才能调用存储过程而不必关心参数顺序

===================我找到了一个解决方法,它可以完美地工作=================

public class blahContext<T>
{
    int i = 0;
    public  IEnumerable<T> ExecuteStoreQuery(string SPname, SqlParameter[] parameters)
    {

        using (var context = new CADAContext())
        {


            string para = string.Join(", ", (from p in parameters
                                             where !"NULL".Equals(p.Value)
                                             select string.Concat(new object[] { "@", p.ParameterName, "={", this.i++, "}" })).ToList<string>());

            object[] x = (from p in parameters
                          where !"NULL".Equals(p.Value)
                          select p.Value).ToArray<object>();

            return context.Database.SqlQuery<T>(SPname + " " + para, x).ToList();

        }
    }
公共类blahContext
{
int i=0;
公共IEnumerable ExecuteStoreQuery(字符串SPname,SqlParameter[]参数)
{
使用(var context=new CADAContext())
{
string para=string.Join(“,”,(来自参数中的p
其中,“NULL”等于(p.Value)
选择string.Concat(新对象[]{“@”,p.ParameterName,“={”,this.i++,“}”}”).ToList();
对象[]x=(来自参数中的p
其中,“NULL”等于(p.Value)
选择p.Value).ToArray();
返回context.Database.SqlQuery(SPname+“”+para,x).ToList();
}
}

这不是因为parameters对象中的参数顺序,而是因为在第二个代码段中,当SP需要
成员INT
值时,您显式地将
@code
值作为第一个参数传递

var result  = context.Database.SqlQuery<resultClass>("mySpName @Code,  @member,@PageSize,@PageNumber" parameters).ToList();
您可以看到,我没有按照SP定义的顺序将参数传递给SP,但是因为它们的名称我不必在意


有关传递参数的不同方法,请参见:这是一些很好的示例。

这是因为您在调用SP时更改了参数的顺序-请参见下面我的答案以获得澄清。这不是一个解决方法,我通过编辑问题添加了解决方法看起来参数的顺序绝对重要…例如,如果SP在这个o中有参数顺序:A,B,C-然后它将前3个参数映射到A,B,C。如果在传递参数值时使用命名参数,则不会映射。例如,exec mySpName PageNumber=1,Code=2,PageSize=3,Member='alpha'
var result  = context.Database.SqlQuery<resultClass>("mySpName @Code,  @member,@PageSize,@PageNumber" parameters).ToList();
db.Database.SqlQuery<resultClass>("mySpName PageNumber=@PageNumber,Code=@Code,PageSize=@PageSize,Member=@member", parameters).ToList();