C# 使用各种参数从实体框架调用存储过程

C# 使用各种参数从实体框架调用存储过程,c#,sql,sql-server,entity-framework,stored-procedures,C#,Sql,Sql Server,Entity Framework,Stored Procedures,我有3个存储过程命名为: 收到 未收到 更新状态 RECEIVED和NOTRECEIVED具有以下params @ProductNumber, @ProductName UPDATESTATUS具有: @BatchNumber 我已经创建了一个方法,用于执行名为UPDATESTATUS的存储过程。我希望使其灵活,以便可以为所有存储过程调用它,而不考虑参数,并将存储过程名称传递给该方法 方法如下: public async Task<int> ExecuteSproc(SqlPar

我有3个存储过程命名为:

  • 收到
  • 未收到
  • 更新状态
  • RECEIVED
    NOTRECEIVED
    具有以下
    params

    @ProductNumber,
    @ProductName
    
    UPDATESTATUS
    具有:

    @BatchNumber
    
    我已经创建了一个方法,用于执行名为
    UPDATESTATUS
    的存储过程。我希望使其灵活,以便可以为所有存储过程调用它,而不考虑参数,并将存储过程名称传递给该方法

    方法如下:

    public async Task<int> ExecuteSproc(SqlParameter[] sqlParameter)
    {
       int result = await db.Database.ExecuteSqlCommandAsync("exec UPDATESTATUS @BatchNumber", sqlParameter);
    
       return result;
    }
    

    请告诉我我将如何做到这一点。我查看了帖子,但答案建议我必须指定参数名称,而我正在尝试使其更通用一些

    您需要以KeyValuePair格式传递存储过程名称和参数

    public List<V> ExecStoredProc<V>(string storedProcedureName, KeyValuePair<string, string>[] parameters)
    {
        if (parameters.Any())
        {
            SqlParameter[] sqlParams = patameters.Select(x => new SqlParameter("@" + x.Key, x.Value)).ToArray();
            var result = _context.Database
                    .SqlQuery<V>(storedProcedureName + " " + string.Join(" ", patameters.Select(x => "@" + x.Key)), sqlParams)
                    .ToList();
            _context.Database.Connection.Close();
            return result;
        }
        else
        {
            var result = _context.Database
                    .SqlQuery<V>(storedProcedureName)
                    .ToList();
            _context.Database.Connection.Close();
            return result;
        }
    }
    
    public List ExecStoredProc(字符串storedProcedureName,KeyValuePair[]参数)
    {
    if(parameters.Any())
    {
    SqlParameter[]sqlParams=patameters.Select(x=>newSQLParameter(“@”+x.Key,x.Value)).ToArray();
    var result=\u context.Database
    .SqlQuery(storedProcedureName+“”+string.Join(“”),patameters.Select(x=>“@”+x.Key)),sqlParams)
    .ToList();
    _context.Database.Connection.Close();
    返回结果;
    }
    其他的
    {
    var result=\u context.Database
    .SqlQuery(存储过程名称)
    .ToList();
    _context.Database.Connection.Close();
    返回结果;
    }
    }
    
    执行

    var parmas = new KeyValuePair<string, string>[] { new KeyValuePair<string, string>("BatchNumber", BatchId.ToString()) };
    
    List<User> list = ExecStoredProc<User>("UPDATESTATUS", parmas);
    
    var parmas=newkeyvaluepair[]{newkeyvaluepair(“BatchNumber”,BatchId.ToString())};
    List List=ExecStoredProc(“UPDATESTATUS”,parmas);
    
    您可以传递
    KeyValuePair
    而不是
    SqlParameter
    数组,并根据链接的帖子生成所需的字符串。这样你可以让它更通用一点。@PaulKaram如果你能提供一个例子,你的解决方案也应该有效,这取决于你是如何使用它的?您能否提供实际调用的代码
    ExecuteSproc
    ?还有,你在尝试时有什么错误吗?@PaulKaram我已经更新了我的code@Code运行此命令时是否有任何错误?
    var parmas = new KeyValuePair<string, string>[] { new KeyValuePair<string, string>("BatchNumber", BatchId.ToString()) };
    
    List<User> list = ExecStoredProc<User>("UPDATESTATUS", parmas);