如何使用LINQ to Entities调用Oracle函数并获取返回值?

5
我正在开发一个应用程序,该应用程序从Oracle 11g数据库中访问数据。我正在使用EF4,并使用LINQ访问数据。 我遇到了这样一种情况:我需要调用存储在包中的函数。此函数还具有返回值。我已将此函数添加到实体数据模型中,但无法执行“添加函数导入”。因此,我无法使用LINQ访问它。 如何调用此函数并获取其返回值?
我之前曾经提出过这个问题,但至今没有得到任何答案。无论如何,我会更新一些详细信息,以便其他人更方便地理解问题并指导我朝着正确的方向前进。我尝试实现了此问题中提出的解决方案,但是出现了异常。
我已将以下内容添加到我的实体数据模型的designer.cs文件中:
   [EdmFunction("TestModel.Store", "TestFunction")]
    public int TestFunction(decimal ALNR, decimal ATID, decimal AUKENR)
    {
        throw new ApplicationException();
    }

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

以下是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>

我是如何调用这个函数的:

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) 
                  };  

但是当我进行以下任一操作时:

ObservableCollection<someType> weekTotaldata = new ObservableCollection<someType>(selectQuery);  //Exception thrown at runtime

或者

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

当在该函数中引发“ApplicationException”异常时,我得到了该异常。除了L2E查询之外的任何地方调用此函数时,这个异常不应该被抛出,对吗?

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

1个回答

4
就我使用Oracle和EF4的经验来看,似乎无法使用函数导入。几个月前我遇到了同样的问题,并尝试了多种方法来导入函数,但都没有成功。但是在搜索中,我发现了OTN上的一个链接,其中指出(不支持Oracle存储函数)。EF4目前还不能调用Oracle函数。即使使用存储过程,您也需要选择返回ref cursor的存储过程。支持的存储过程包括没有返回值但可能有OUT或IN OUT参数的过程和包方法。
这是链接:Here is the link 但如果您正在使用SQL Server,则可以通过某种方式在EF4中完成用户定义函数的导入。以下链接可能对您有所帮助:
Link1:Link1 Link2:Link2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接