实体框架4.1原始SQL

时间:2012-09-13 11:14:55

标签: sql entity-framework-4.1

我正在使用Entity Framework 4.1开发ASP.Net MVC 3应用程序。对于我需要执行的特定复杂查询,我决定编写一个原始SQL查询并将其传递给内置的 dbSet.SqlQuery 方法。

我有一个如下所示的Service方法,我将SQL查询分配给名为 query 的字符串变量。由于查询传递了两个参数,我已经参数化这些以防止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中不存在任何映射   到已知的托管提供商本机类型

有没有人对我如何解决这个问题有任何建议?

感谢您的帮助。

2 个答案:

答案 0 :(得分:8)

民间

问题是我使用 ObjectParameter 来创建我的参数。我把它改为 SqlParameter ,它运行正常。见下文。

从此更改

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

到此

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

它有效。希望这有助于其他人。

答案 1 :(得分:0)

通过快速Google搜索,它看起来就像你的结束。我认为您缺少为SQL查询设置返回类型:

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

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