2012-04-23 43 views
4

尝试使用下面的代码来执行在EF存储的过程:在ExecuteStoreQuery EF中执行存储过程。这是EF中的一个错误吗?

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

但不断收到此错误:

Procedure or function 'GetByName' expects parameter '@FirstName', which was not supplied.

和SQL事件探查器:

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

什么是错的用上面的ExecuteStoreQuery代码?

回答

10

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

想想你的查询需要是:

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

也应该说,如果这是PROC您的数据库和数据的一个标准部分模型,那么你应该import it into your EDM,所以它可以直接在你的上下文中使用。

+0

我怎样才能实现它使用ExecuteStoreQuery方法?我无法控制将要生成的sql语句。这完全取决于ExecuteStoreQuery方法。 – user384080 2012-04-23 23:59:52

+1

对不起,澄清了我的答案。 – dez 2012-04-24 00:02:43

+1

感谢队友..单词“exec”是可选的。测试与返回this._repositoryContext.ObjectContext.ExecuteStoreQuery (“GetByName @FirstName”,params)和工作正常! – user384080 2012-04-24 00:13:26

2

使用ExecuteFunction而不是ExecuteStoreQuery,它更适合于“ad-hoc”查询。

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

存储过程也可以映射为上下文中的函数,因此可以用作类型化方法。看看Using stored procedures with Entity Framework

+0

已经试过这个,但没有运气 – user384080 2012-04-23 23:57:52

0

这是我做的EF使用SP,如果您有多个参数: - 如果你没有在CommandText属性中添加参数(例如@practiceId),那么你的错误

 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); 
    } 

你收到