【问题标题】:Entity Framework Return List from Stored Procedure存储过程中的实体框架返回列表
【发布时间】:2015-05-14 19:05:00
【问题描述】:

我正在尝试从 Entity Framework 中的存储过程返回一个 int 列表。

我很好地创建了存储过程,并将其添加到实体框架中。我试图将它绑定到一个复杂的类型,但是当我打开函数导入时。

它会自动生成一个复杂类型,该类型只返回一个 int 而不是一个结果集。

有谁知道如何导入一个返回列表作为结果集的实体?

【问题讨论】:

  • 向我们展示一些您已经拥有的代码,以便我们提供帮助。
  • 这与代码无关。我可以在其中添加一个带有整数列表的空类,但这是与 GUI 相关的,我没有使用代码优先,所以应该全部通过 GUI。
  • 我有一个存储过程,它基本上只是选择我想在 c# 中获取的 id 列表

标签: c# entity-framework stored-procedures


【解决方案1】:

如果您只是想从存储过程中获取列表,则不需要映射任何特殊内容。

这样称呼它:

var results = dbContext.Database.SqlQuery<int>("SP_YourSP").ToList();

这应该返回一个整数列表

【讨论】:

  • 这对我有用。这是对象映射的一个例外,但可以轻松完成工作
  • @AntoinePelletier MVC 和 WebForms 与您使用什么技术访问数据库有什么关系?
  • 我在MVC 和web-form 中都使用了这种技术以及完全相同版本的实体框架,在MVC 中没问题,但在web-form 中不起作用。首先,网络表单中没有.Database,该功能不存在。也许只有我一个人,你在web-form 中成功了吗?
  • 我已经编辑了我的答案,使其更加清晰。数据库是 EF 的 dbContext 上的一个属性。如果您使用相同版本的 EF,您的上下文中应该始终有一个数据库属性。
  • 但是话又说回来,问题并没有提到里面使用了哪个技术实体,所以它仍然是一个有效的答案,我才意识到......
【解决方案2】:

我创建了这个示例存储过程,返回一个 int 值列表:

CREATE PROCEDURE dbo.GetListOfInt
AS BEGIN
    SELECT *
    FROM 
    (VALUES (42), (4711), (8088), (80286), (80486), (655235)) AS VT(VC)
END

然后我将此存储过程添加到我的 EF .edmx 模型并创建此函数导入:

查询存储过程告诉我它返回一个由int 值组成的结果集 - 因此我在函数导入对话框中将返回值定义为 Scalar: Int32 的集合。

之后,我可以调用该存储过程并返回如下结果:

using (testEntities ctx = new testEntities())
{
    ObjectResult<int?> result = ctx.GetListOfInt();

    foreach (int intValue in result.AsEnumerable())
    {
        Console.WriteLine("INT value returned: {0}", intValue);
    }
}

【讨论】:

  • 如果你还在身边,你是否知道为什么,它最初会返回一个可以为空的结果集,在第二步中你可以看到可以为空的结果为 false
  • @Space:我自己也在想——不确定,抱歉。我猜 EF 只是不能确定至少返回一行 - 存储过程(如果它更现实一点)也可能根本不返回任何内容(如果表中没有匹配的行对于提供的WHERE 标准)
  • 这行得通,但是将 List 返回到 API 调用时需要强制转换。因此,无论谁在执行此操作,都不要忘记在遇到错误时正确转换。
  • 其实这没有意义。如果它没有返回任何行,则结果将是一个空列表,而不是一个空元素列表。这么多年了,还是个谜。
【解决方案3】:

如果你想得到一个带有映射类的列表,试试这个

var results = dbContext.Database.SqlQuery<youclass>("SP_YourSP").ToList(); 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多