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 到已知托管提供程序本机类型的映射

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

谢谢你的帮助。

4

2 回答 2

8

乡亲

问题是我使用ObjectParameter来创建我的参数。我改为将其更改为SqlParameter并且效果很好。见下文。

从此改变

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

对此

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

它奏效了。希望这对其他人有帮助。

于 2012-09-13T13:18:17.333 回答
0

从快速的谷歌搜索来看,它看起来很接近。我认为您缺少为 SQL 查询设置返回类型:

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

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

于 2012-09-13T11:24:02.837 回答