2011-05-19 71 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