【问题标题】:Can't get data out using SQL query in Entity Framework无法在实体框架中使用 SQL 查询获取数据
【发布时间】:2013-07-16 18:26:04
【问题描述】:

我正在尝试使用以下 SQL 查询从我的数据库中获取前两列数据:

SELECT  Id, DomainUrl
FROM    ( SELECT    ROW_NUMBER() OVER ( ORDER BY Id ) AS RowNum, Id, DomainUrl
          FROM      SiteDatas
        ) AS RowConstrainedResult
WHERE   RowNum >= 1
    AND RowNum <= 10
ORDER BY RowNum

我正在使用实体框架并为行传递参数,以便以后可以通过 ajax 将其用作加载功能的滚动。但是,当我到达线路时出现错误:

var stores = db.SiteDatas.SqlQuery(SQL, parameters).ToList();

这是一个实体命令执行异常,表明数据读取器与类型的指定模型(我的数据库)成员不兼容,“机器人”(这是我调用的那个之后的下一列),不在数据阅读器中有一个对应的同名列。

我将如何以可以序列化为 json 的方式仅获取前两列?

【问题讨论】:

  • SiteDatas 是否包含机器人列?因为查询不
  • 确实如此,但我不希望结果是这样
  • 您可以在选择查询中添加NULL AS Robots 以始终将其返回为空?
  • 还有很多其他列,将它们全部归零真的是最好的方法吗?
  • 也许您可以基于此查询创建一个仅包含所需列的新类?

标签: c# sql entity-framework


【解决方案1】:

DbSet.SqlQueryDatabase.SqlQuery 命令都返回实体实例。您的 sql 查询必须返回与您的实体相同的列。很可能,您的 SiteData 类包含 SQL 查询中不存在的 Robots 列。

您仍然可以使用Database.SqlQuery< T > 返回您的数据,前提是您指定了返回类型。返回类型不必是实体类型,只需与结果集具有相同的列名即可。

假设db 是一个DbContext 实例,你可以这样写:

public class MyResults
{
   public int ID{get;set;}
   public string DomainUrl {get;set;}
}

...

var stores = db.Database.SqlQuery<MyResults>(SQL, parameters).ToList();

【讨论】:

  • 确实有,但我不希望这样,有没有办法解决这个问题?
  • 是的,Database.SqlQuery 可以返回任何属性匹配结果列的类型
  • 我已经试过这个并得到错误:非泛型方法'System.Data.Entity.DbSet.SqlQuery(strin, params object[]) cannot与类型参数一起使用。
  • 方法错误!尝试 Database.SqlQuery,而不是 DbSet.SqlQuery
  • 另一个重要的事情是,如果我们不把 {get;set;} 放在模型中,它就不起作用,遇到这个问题想分享它以便其他人不会。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多