尝试使用以下代码在EF中执行存储过程:
var params = new object[] {new SqlParameter("@FirstName", "Bob")};
return this._repositoryContext.ObjectContext.ExecuteStoreQuery<ResultType>("GetByName", params);
但不断收到此错误:
过程或函数'GetByName'需要参数'@FirstName', 没有提供。
和sql profiler:
exec sp_executesql N'GetByName',N'@FirstName nvarchar(100),@FirstName=N'Bob'
上面的ExecuteStoreQuery代码有什么问题?
答案 0 :(得分: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,因此它可以直接在您的上下文中使用。
答案 1 :(得分:2)
使用ExecuteFunction而不是更适合“ad-hoc”查询的ExecuteStoreQuery。
var parameters = new ObjectParameter[] {new ObjectParameter("FirstName", "Bob")};
return this._repositoryContext.ObjectContext.ExecuteFunction<ResultType>("GetByName", parameters);
存储过程也可以在上下文中映射为函数,因此可以用作类型化方法。看看Using stored procedures with Entity Framework。
答案 2 :(得分: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),则会收到您收到的错误