2012-09-13 143 views
1

我正在开发一个使用实体框架4.1的ASP.Net MVC 3应用程序。对于需要执行的特定复杂查询,我决定编写一个原始SQL查询并将其传递给构建于db2SqlQuery方法中的实体框架4.1原始SQL

我有一个像下面的服务方法,其中我将SQL查询分配给名为查询的字符串变量。由于查询传递了两个参数,我已将这些参数化以防止SQL注入。

public IList<User> GetAvailableLocums(int shiftID, int shiftDateID) 
{ 
      var query ="Select .... where t1 = @p0 and t2 = @p1"; 

      ObjectParameter _shiftID = new ObjectParameter("p0", shiftID); 
      ObjectParameter _shiftDateID = new ObjectParameter("p1", shiftDateID); 

      object[] parameters = new object[] { _shiftID, _shiftDateID }; 


      return _UoW.User.GetWithRawSql(query, parameters).ToList(); 
} 

然后,我将查询和参数传递给我的存储库中的一个方法,该方法为我执行查询。

public IEnumerable<TEntity> GetWithRawSql(string query, params object[] parameters) 
{ 
      return dbSet.SqlQuery(query, parameters).ToList(); 
} 

我知道查询是正确的,因为我已经在SQL Server Management Studio中进行了测试,不过,我目前得到以下错误,当我尝试运行这段代码

从对象不存在任何映射键入System.Data.Objects.ObjectParameter 到已知的托管提供原生型

有没有人有任何建议,我怎么能解决这个问题?

感谢您的帮助。

回答

8

乡亲

的问题是,我用ObjectParameter创建我的参数。我改为这个SqlParameter它工作正常。见下文。从这个

ObjectParameter _shiftID = new ObjectParameter("p0", shiftID); 

改成这样

SqlParameter _shiftID = new SqlParameter("p0", shiftID); 

和它的工作。希望这可以帮助别人。

0

从快速谷歌搜索,它看起来像你的关闭。我认为你错过了为你的SQL查询设置返回类型:

return dbSet.SqlQuery<TEntity>(query, parameters).ToList(); 

这只是告诉实体框架如何映射它。

+0

对不起,这不是解决方案 – tgriffiths