【问题标题】:Dynamic SQL based stored procedure call in Entity Framework实体框架中基于动态 SQL 的存储过程调用
【发布时间】:2011-12-29 12:20:39
【问题描述】:

对于我们最近的一个项目,我们创建了一个存储过程来生成 SQL 并最终执行它。存储过程的目的是基于动态列创建数据透视。

当我尝试使用实体框架使用通常的函数导入来访问它时,当我尝试访问存储过程时,它会返回任何内容,因为它需要动态类型来存储检索到的数据。

在我们的例子中,这是一个动态查询,而 linq 无法获取返回的列。因此,要解决我所做的就是以传统方式调用存储过程,即创建DataAdapterSqlCommand 对象和SqlConnection 对象。

但是使用实体框架调用这种存储过程的正确方法是什么?

提前致谢。

【问题讨论】:

  • 我需要在这里补充一下,我不能自己创建复杂类型,因为返回的列将来可能会增加或减少。

标签: c# asp.net entity-framework stored-procedures


【解决方案1】:

实体框架不支持来自存储过程的动态结果集。它也不支持使用动态 SQL 的存储过程,因为它无法从过程中获取静态结果集声明。因此,您必须确保您的过程始终返回静态类型(相同数量的同名列),或者您必须使用传统的 ADO.NET 来执行该过程。

【讨论】:

  • k 谢谢下次我遇到这样的事情时会记住这一点的:)
  • @Ladislav Mrnka 现在可以使用 EF 4 中的动态类型吗?我可以使用带有动态类型的DbContext.Database.SqlQuery() 来检索带有动态结果集的动态对象吗?问题是我正在尝试在这里实现其他目标:[dynamic-user-extensible-entities-using-entity-framework] stackoverflow.com/questions/15019705/…
  • @Mortalus:答案是否定的。 EF 不适用于动态类型。此外,对于用户可扩展实体(就在运行时添加列而言)而言,这不是一项好的技术。
  • @Ladislav Mrnka:谢谢......那么当一个人想要在我上面评论中的问题中描述的系统中实现类似用户可扩展对象之类的东西时,应该采取什么方法?跨度>
【解决方案2】:

可以按照以下步骤进行:

  1. 将 SP 的动态部分存储在变量中,并在 SP 末尾打印该变量。

  2. 执行 SP 并使用一些数据执行它。

  3. 在结果窗口中打开消息选项卡。

  4. 复制在(x 行受影响)之后编写的代码;

  5. 将该代码粘贴到 SP 中并注释掉其他所有内容,直到变量声明。

  6. 执行新修改的 SP 并将其添加到实体框架中。这一次,实体框架会做出你想要的复杂类型。

  7. 取消注释之前注释的代码并删除您从“消息”选项卡复制的数据并再次执行。

每次从 SP 添加或删除列时都遵循相同的过程。

【讨论】:

  • 非常淘气。但我喜欢它。
猜你喜欢
  • 2015-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-03
  • 1970-01-01
  • 2010-12-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多