Linq 使用存储过程作为edmx文件中的函数

Linq 使用存储过程作为edmx文件中的函数,linq,linq-to-entities,edmx,Linq,Linq To Entities,Edmx,我有一个实体模型文件(edmx)文件,它包含很少的表和存储过程 如何调用映射到函数的存储过程?我认为它应该很简单,我确实在edmx文件中看到了映射,但我不知道如何在代码中使用它 以下是一个映射示例: <Function Name="pa_crud_broker_ADD" Aggregate="false" BuiltIn="false" NiladicFunction="false" IsComposable="false" ParameterTypeSemantics="A

我有一个实体模型文件(edmx)文件,它包含很少的表和存储过程

如何调用映射到函数的存储过程?我认为它应该很简单,我确实在edmx文件中看到了映射,但我不知道如何在代码中使用它

以下是一个映射示例:

       <Function Name="pa_crud_broker_ADD" Aggregate="false" BuiltIn="false" NiladicFunction="false" IsComposable="false" ParameterTypeSemantics="AllowImplicitConversion" Schema="dbo">
          <Parameter Name="BrokerId" Type="int" Mode="InOut" />
          <Parameter Name="Name" Type="nvarchar" Mode="In" />
          <Parameter Name="Identifier" Type="nvarchar" Mode="In" />
        </Function>

          <FunctionImport Name="pa_crud_broker_ADD" ReturnType="Collection(Int32)">
            <Parameter Name="BrokerId" Mode="InOut" Type="Int32" />
            <Parameter Name="Name" Mode="In" Type="String" />
            <Parameter Name="Identifier" Mode="In" Type="String" /></FunctionImport>
<FunctionImportMapping FunctionImportName="pa_crud_broker_ADD" FunctionName="PAEntities.store.pa_crud_broker_ADD" />

我将感谢任何帮助


谢谢。

我的印象是,您不能调用存储过程……实体框架为您调用它们……基本上,存储过程是实时SQL生成的可选替代品,实体框架会根据需要调用它们


我还没有听说过能够在实体框架中手动“调用”存储的过程…

我有点生疏,但是您应该能够通过以下两种方式之一调用您的函数。如果您是从模型生成ObjectContext,那么您的对象上下文上应该有一个与函数名称匹配的方法(在您的例子中,是pa_crud_broker_ADD)。你应该可以这样称呼它:

var objectContext = new MyObjectContext(...);
var result = objectContext.pa_crud_broker_ADD(...);
如果您没有从模型生成ObjectContext,那么您应该能够使用以下内容:

var objectContext = new ObjectContext(...);
var result = objectContext.ExecuteFunction<List<int>>("pa_crud_broker_ADD", ...);
var objectContext=newobjectcontext(…);
var result=objectContext.ExecuteFunction(“pa_crud_broker_ADD”,…);

我不能完全肯定第二个案例的返回结果。我不确定EFV1是否支持这种转换。我知道EF v4在这方面增加了一些相当大的改进,因此如果EF v1不支持它,我会研究EF v4。

我遇到了这个问题,发现我缺少此处描述的“函数导入”步骤:

简言之:

  • 打开你的.edmx设计器
  • 右键单击并从菜单中选择添加->“功能导入”
  • 从下拉列表中选择存储过程
  • 添加名称
  • 单击“确定”

  • 您完全可以从实体框架中调用存储过程。该链接解释了如何在模型中定义存储过程,而不是如何实际调用它们。我还注意到,如果我将函数(即映射的存储过程)返回实体模块中的实体,我会看到它。但是如果它返回一个前置类型,它就不会显示。例如,如何运行返回int的存储过程?