2011-05-19 75 views
5

我正在研究从Oracle 11g数据库访问数据的应用程序。我正在使用EF4,并使用LINQ访问数据。 我碰到过一个场景,我需要调用存储在包中的函数。这个函数也有一个返回值。我已将此函数添加到实体数据模型,但无法对其执行“添加函数导入”。因此我无法使用LINQ访问它。 如何调用此函数并获取它的返回值?如何调用Oracle函数,返回值使用LINQ to Entities?

我刚才问这个问题,但还没有得到任何答案。无论如何,我正在更新一些细节,以便其他人能够方便地理解问题并指导我朝着正确的方向前进。我曾尝试实施此question中提出的解决方案,但遇到异常。

我已经添加了以下到我的实体数据模型的designer.cs文件:

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

以下是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) 
        }; 

但是当我做以下任何一项时:

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

我得到了在该函数 “ApplicationException的” 抛出的异常。当这个函数在其他地方被调用时,这个 异常是不是应该抛出L2E查询异常?

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

回答

4

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

Here is the link

但是,如果你正在使用SQL Server的一些如何完成用户自定义函数导入在EF4。这里有一些链接可能会帮助您:

Link1

Link2