C# 实体框架中基于SQL的动态存储过程调用

C# 实体框架中基于SQL的动态存储过程调用,c#,asp.net,entity-framework,stored-procedures,C#,Asp.net,Entity Framework,Stored Procedures,对于我们最近的一个项目,我们创建了一个存储过程来生成SQL并最终执行它。存储过程的目的是基于动态列创建数据透视 当我尝试访问存储过程时,使用EntityFramework使用通常的函数import访问它时,它将返回任何内容,因为它需要一个动态类型来存储检索到的数据 在我们的例子中,这是一个动态查询,linq无法获取返回的列。因此,为了解决这个问题,我用传统的方法调用存储过程,即创建DataAdapter和SqlCommand对象和SqlConnection对象 但是,使用实体框架调用这种存储过程

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

当我尝试访问存储过程时,使用EntityFramework使用通常的函数import访问它时,它将返回任何内容,因为它需要一个动态类型来存储检索到的数据

在我们的例子中,这是一个动态查询,linq无法获取返回的列。因此,为了解决这个问题,我用传统的方法调用存储过程,即创建
DataAdapter
SqlCommand
对象和
SqlConnection
对象

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


提前感谢。

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

可以遵循以下步骤:

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

  • 执行SP并使用一些数据执行它

  • 在结果窗口中打开消息选项卡

  • 复制(受影响的x行)之后写入的代码

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

  • 执行新修改的SP并将其添加到实体框架中。这一次,实体框架将生成您想要的复杂类型

  • 取消注释前面的注释代码,删除从Messages选项卡复制的数据,然后再次执行


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

    我需要在这里添加一个我自己无法创建复杂类型的内容,因为返回的列将来可能会增加或减少。k感谢您下次我了解类似内容时会记住这一点:)@Ladislav Mrnka现在EF 4中的动态类型可以这样做吗? 我可以使用具有动态类型的
    DbContext.Database.SqlQuery()
    来检索具有动态结果集的动态对象吗?问题是我试图在这里实现其他目标:[使用实体框架的动态用户可扩展实体]@Verternus:答案是否定的。EF不适用于动态类型。此外,对于用户可扩展实体来说,这不是一项好技术(在运行时添加列)。@Ladislav Mrnka:谢谢。。。那么,当一个人想要在一个系统中实现像用户可扩展对象这样的东西时,应该采取什么样的方法呢?就像我在上面评论的问题中所描述的那样?非常顽皮。但是我喜欢它。