使用Entity Framework的存储过程只能获得一列

时间:2016-04-18 19:02:03

标签: asp.net entity-framework

我想获得该表的特定列但是我收到此错误

  

数据阅读器与指定的“NewsDatabaseModel.News”不兼容。类型为“NewsSubject”的成员在数据读取器中没有相应名称的相应列。

我不想通过我想要调用它的模型使用存储过程。

这是我的代码

var NewsList = db.Database.SqlQuery<News_Application.News>("[dbo].[GetAllNews]").ToList();
return View("NewsList");

SQL:

CREATE PROCEDURE GetAllNews
AS
BEGIN
    SELECT NewsId, NewsTitle  
    FROM News
END

1 个答案:

答案 0 :(得分:2)

您的News_Application.News类必须具有与存储过程中返回的select相同的命名属性,并且所有属性必须存在于select语句中。

由于您只需要一个列,因此请创建一个ViewModel类并将您的过程绑定到它,如下所示:

public class NewsViewModel
{
     public int NewsId { get; set;}
     public string NewsTitle { get; set; }
}

并绑定您的程序

var NewsList = db.Database.SqlQuery<NewsViewModel>("[dbo].[GetAllNews]").ToList();

[编辑]

要返回匿名对象,请执行以下操作:

var NewsList = db.Database.SqlQuery<NewsViewModel>("[dbo].[GetAllNews]").Select(x => new { x.NewsId, x.NewsTitle }).ToList();

这将返回一个没有类和所需属性的对象。

无论哪种方式,我相信你应该重新考虑你的设计。不应该使用存储过程来执行这样简单的查询。 假设您的实体名称为News

这就足够了:

var NewsList = db.News.Select(x => new { x.NewsId, x.NewsTitle }).ToList();

我建议您使用此网站来加快实体框架的速度:http://www.entityframeworktutorial.net/EntityFramework5/entity-framework5-introduction.aspx