4

尝试使用以下代码在 EF 中执行存储的过程:

var params = new object[] {new SqlParameter("@FirstName", "Bob")};
return this._repositoryContext.ObjectContext.ExecuteStoreQuery<ResultType>("GetByName", params);

但不断收到此错误:

过程或函数“GetByName”需要未提供的参数“@FirstName”。

并来自 sql 探查器:

exec sp_executesql N'GetByName',N'@FirstName nvarchar(100),@FirstName=N'Bob'

上面的 ExecuteStoreQuery 代码有什么问题?

4

3 回答 3

10

忽略这params是一个保留字的事实......

认为您的查询需要:

var params = new object[] {new SqlParameter("@FirstName", "Bob")};
return this._repositoryContext.ObjectContext.ExecuteStoreQuery<ResultType>("exec GetByName @FirstName", params);

还应该说,如果该过程是您的数据库和数据模型的标准部分,那么您应该将它导入您的 EDM,以便它可以直接在您的上下文中使用。

于 2012-04-23T23:46:22.393 回答
2

使用更适合“临时”查询的 ExecuteFunction 而不是 ExecuteStoreQuery。

var parameters = new ObjectParameter[] {new ObjectParameter("FirstName", "Bob")};
return this._repositoryContext.ObjectContext.ExecuteFunction<ResultType>("GetByName", parameters);

存储过程也可以映射为上下文中的函数,因此可以用作类型化方法。看看将存储过程与实体框架一起使用

于 2012-04-23T23:38:23.797 回答
0

如果您有多个参数,这就是我在 EF 中使用 SP 所做的:-

        public virtual ObjectResult<GetEpisodeCountByPracticeId_Result> GetEpisodeCountByPracticeId(Nullable<int> practiceId, Nullable<System.DateTime> dat1)
    {

        SqlParameter practiceIdParameter = practiceId.HasValue ?
            new SqlParameter() { ParameterName = "practiceId", Value = practiceId, SqlDbType = SqlDbType.Int } :
            new SqlParameter() { ParameterName = "practiceId", SqlDbType = SqlDbType.Int }; 

        SqlParameter dat1Parameter = dat1.HasValue ?
            new SqlParameter() { ParameterName = "dat1", Value = dat1, SqlDbType = SqlDbType.DateTime }:
            new SqlParameter() { ParameterName = "dat1", SqlDbType = SqlDbType.DateTime }; 


        return ((IObjectContextAdapter)this).ObjectContext.ExecuteStoreQuery<GetEpisodeCountByPracticeId_Result>("exec GetEpisodeCountByPracticeId @practiceId, @dat1", practiceIdParameter, dat1Parameter);
    }

如果您没有在 commandText 属性中添加参数(例如@practiceId),那么您会收到收到的错误

于 2014-09-22T12:22:51.273 回答