如何调用Oracle函数,使用LINQ to Entities返回值?

Has*_*him 5 linq-to-entities entity-framework oracle11g

我正在开发一个从Oracle 11g数据库访问数据的应用程序.我正在使用EF4,使用LINQ访问数据.我遇到过需要调用存储在包中的函数的场景.此函数还具有返回值.我已将此函数添加到实体数据模型,但无法对其执行"添加函数导入".因此我无法使用LINQ访问它.如何调用此函数并获得它的返回值?

我不久前问过这个问题,但还没有得到任何答案.无论如何,我正在更新它的一些细节,以便其他人了解问题并引导我朝着正确的方向前进.我试图实现这个问题中提出的解决方案,但我得到了一个例外.

我已将以下内容添加到我的实体数据模型的designer.cs文件中:

   [EdmFunction("TestModel.Store", "TestFunction")]
    public int TestFunction(decimal ALNR, decimal ATID, decimal AUKENR)
    {
        throw new ApplicationException();
    }
Run Code Online (Sandbox Code Playgroud)

以下是edmx文件的一小部分:

<edmx:Edmx Version="2.0" xmlns:edmx="http://schemas.microsoft.com/ado/2008/10/edmx">
<!-- EF Runtime content -->
    <edmx:Runtime>
    <!-- SSDL content -->
        <edmx:StorageModels>
           <Schema Namespace="TestModel.Store" Alias="Self" Provider="Oracle.DataAccess.Client" ProviderManifestToken="11g" xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator" xmlns="http://schemas.microsoft.com/ado/2009/02/edm/ssdl">
               <Function Name="TestFunction" ReturnType="number" Aggregate="false" BuiltIn="false" NiladicFunction="false" IsComposable="true" ParameterTypeSemantics="AllowImplicitConversion" StoreFunctionName="PKG_TURNUS.SUMUKE" Schema="SYSTEM">
      <Parameter Name="ATID" Type="number" Mode="In" />
      <Parameter Name="ALNR" Type="number" Mode="In" />
      <Parameter Name="AUKENR" Type="number" Mode="In" />
    </Function>
Run Code Online (Sandbox Code Playgroud)

以下是我调用此函数的方法:

var selectQuery = from T in _context.Table1
                  join A in _context.Table2 on T.columnA equals A.columnB
                  join TU in _context.Table3 on T.columnC equals TU.columnD
                  where T.columnD == 5 && T.columnE == someVariable
                  select new someType
                  {
                      propertyA = A.columnG,
                      propertyB = _context.TestFunction(T.columnE, A.columnF, TU.columnH) 
                  };  
Run Code Online (Sandbox Code Playgroud)

但是,当我执行以下任何操作时:

ObservableCollection<someType> weekTotaldata = new ObservableCollection<someType>(selectQuery);  //Exception thrown at runtime
Run Code Online (Sandbox Code Playgroud)

要么

foreach (var ttu in selectQuery) //Exception thrown at runtime
{
    double testval = ttu.propertyB;
} 
Run Code Online (Sandbox Code Playgroud)

我得到了该函数"ApplicationException"中抛出的异常.在L2E查询的其他地方调用此函数时,不应抛出此异常吗?

我究竟做错了什么?如何从Linq-To-Entities调用oracle函数?请注意,我尝试调用的函数不是内置的oracle函数,而是用户定义的函数.

Sye*_*eda 4

就我使用 Oracle 开发 EF4 而言,函数导入似乎在这里不起作用。几个月前我遇到了同样的问题,并尝试了多种方法来导入函数,但没有任何运气。但在搜索过程中,我在 OTN 上发现了一个链接,其中指出(不支持 Oracle 存储函数)。EF4 还没有给我们调用 oracle 函数的选项。即使使用存储过程,您也需要选择返回引用游标的存储过程。支持的存储过程包括没有返回值但可能有 OUT 或 IN OUT 参数的过程和包方法。

链接在这里

但是,如果您使用 Sql 服务器,则可以了解如何在 EF4 中完成用户定义函数导入。以下是一些可能对您有帮助的链接:

链接1

链接2