使用Entity Framework使用动态参数执行SQL Server存储过程

我们想使用EF执行存储过程。

我们的方法是动态提供输入参数,如下所示:

PropertyInfo[] props = search.GetProperties(); foreach (var item in props) { object itemValue = item.GetValue(SearchCondition, null); if (itemValue == null) parameterList.Add(new SqlParameter(string.Format("@{0}", item.Name), DBNull.Value)); else parameterList.Add(new SqlParameter(string.Format("@{0}", item.Name), itemValue.ToString())); } 

这是其他常见的输入:

 parameterList.Add(new SqlParameter("@order", (object)"desc")); parameterList.Add(new SqlParameter("@Page", page)); parameterList.Add(new SqlParameter("@PageSize", rows)); 

还有输出参数:

 parameterList.Add(new SqlParameter() { DbType = DbType.Int32, ParameterName = "@TotalCount out", SqlValue = DBNull.Value, Direction = ParameterDirection.Output }); 

这是执行代码(运行存储过程)

 object[] para= parameterList.ToArray(); var records = context.Database.SqlQuery(string.Format(@"Exec RTI.RptCustomerInformation {0}", parameters), para).ToList(); 

当我们运行它时会有一个例外:

int附近的语法不正确

这是我们在SQL中执行的存储过程,它在SQL Server Management Studio中正确运行:

 EXEC @return_value = [RTI].[RptCustomerInformation] @AccountNumber = NULL, @CardNumber = NULL, @CustomerNumber = NULL, @CustomerType = NULL, @NationalNumber = NULL, @Name = NULL, @FamilyName = NULL, @IdentityNumber = NULL, @IdSerial = NULL, @NationalityType = NULL, @InhabitancyType = NULL, @JobType = NULL, @c13 = NULL, @CustomerDefined = NULL, @OpenerBranch = NULL, @CodePosti = NULL, @RegisterNumber = NULL, @order = NULL, @Page = NULL, @PageSize = NULL, @TotalCount = @TotalCount OUTPUT SELECT @TotalCount as N'@TotalCount'