使用Entity Framework无法通过SQL查询获取数据

3

我尝试使用以下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

我正在使用Entity Framework,并传递参数以便将其稍后用作通过Ajax进行滚动加载函数的行。但是,当我到达以下行时,出现错误:
var stores = db.SiteDatas.SqlQuery(SQL, parameters).ToList();

这是一个实体命令执行异常,它指出数据读取器与指定模型(我的数据库)成员类型“Robots”不兼容(我正在调用的列后面),在数据读取器中没有相应的列与同名。

我该如何以可序列化为json的方式获取前两列数据?


1
SiteDatas 包含 Robots 列吗?因为查询中没有。 - Panagiotis Kanavos
确实如此,但我不希望它作为结果。 - Kayra
你可以在你的选择查询中添加 NULL AS Robots 来始终返回 null 值。 - Nenad Zivkovic
还有相当多的其他列,将它们全部置空真的是最好的方法吗? - Kayra
1
也许你可以基于这个查询创建一个新的类,只包含所需的列? - Nenad Zivkovic
1个回答

7

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

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

假设dbDbContext实例,则可以编写:

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

...

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

它确实会产生这样的结果,但我不想要它,有没有其他方法可以解决这个问题? - Kayra
1
是的,Database.SqlQuery 可以返回任何类型,只要它的属性与结果列匹配。 - Panagiotis Kanavos
我已经尝试过这个,但是出现了错误:非泛型方法 'System.Data.Entity.DbSet<Bescoured.DomainModels.SiteData>.SqlQuery(string, params object[])' 不能与类型参数一起使用。 - Kayra
错误的方法!请尝试使用Database.SqlQuery<YourCustomClass>,而不是DbSet.SqlQuery。 - Panagiotis Kanavos
1
另一个重要的事情是,如果我们在模型中不加{get;set;},它就不能正常工作。我遇到了这个问题,想分享一下,以便其他人不会遇到同样的问题。 - Anshul Nigam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接