2012-11-29 50 views
0

我的程序中有一個實體框架4實體模型。有我在我的SQL定義的存儲功能,任何地方12.0.1數據庫稱爲GuidToPrefix在實體框架中使用存儲函數4查詢

CREATE OR REPLACE FUNCTION GuidToPrefix(ID UNIQUEIDENTIFIER) RETURNS INT AS 
BEGIN 
    RETURN CAST(CAST(ID AS BINARY(4)) AS INT) 
END; 

遵循本MSDN article的方向,我添加功能到我的EDMX:

<Function Name="GuidToPrefix" ReturnType="int" Aggregate="false" BuiltIn="false" NiladicFunction="false" IsComposable="true" ParameterTypeSemantics="AllowImplicitConversion" Schema="DBA"> 
    <Parameter Name="ID" Type="uniqueidentifier" Mode="In" /> 
</Function> 

要完全誠實,我從數據庫更新了模型,並在嚮導的第一個選項卡上的列表中檢查了該函數。我不知道這是否有所作爲,但我不明白爲什麼會這樣。

根據文章,我需要在C#類中添加函數的定義。我的問題是它沒有告訴我要把它放在什麼類中。我添加了一個全新的類嗎?我是否創建一個新的.CS文件並執行如下操作:

還是我把它放在部分實體類中?

partial MyEntities { 

    [EdmFunction("CarSystemModel.Store", "GuidToPrefix")] 
    public static int GuidToPrefix(Guid id) { 
     throw new NotSupportedException("Direct calls to GuidToPrefix are not supported."); 
    } 
} 

我有兩個項目使用這個實體模型。一個是類庫,模型定義在其中。另一個是另一個使用它的解決方案中的另一個類庫。我已經試過這兩個例子以上和二級庫查詢從編譯器在兩種情況下生成此錯誤:

The name 'GuidToPrefix' does not exist in the current context 

很顯然,我不是做正確的事情。有沒有人試過這個,並得到它的工作?

+0

事實上,放置靜態方法並不重要,但會放在上下文中,以表示它是數據層的一部分。 –

+0

@GertArnold:不,它沒有。這個例子令人困惑,因爲至少我不清楚他們是否把它放在示例類中。一旦這個概念通過我的頭,這很簡單。我不能100%確定函數必須是靜態的;如果你將它作爲上下文的實例方法,它可能會工作。雖然,我已經掌握了它的工作,但我不會去玩。 –

回答

0

我找到了答案。我創建了一個文件,在我的項目的一部分,其中的實體模型定義的MyEntities類

回憶:

partial MyEntities { 

    [EdmFunction("CarSystemModel.Store", "GuidToPrefix")] 
    public static int GuidToPrefix(Guid id) { 
     throw new NotSupportedException("Direct calls to GuidToPrefix are not supported."); 
    } 
} 

這是罰款,這一切編譯。我的問題不在這裏,而是在我必須使用該功能的項目中。

在該項目中,在一個名爲DataInterface類,我有代碼的方法是這樣的:

var query = from read in context.Reads 
      from entry in context.Entries 
           .Where(e => GuidToPrefix(read.ID) == e.PrefixID && read.ID == e.ID) 
       ..... 

問題是,我需要補充的是包含的在C#聲明的類名在Where子句中的GuidToPrefix函數。也就是說,我需要寫上面的表達式爲:

var query = from read in context.Reads 
      from entry in context.Entries 
           .Where(e => MyEntities.GuidToPrefix(read.ID) == e.PrefixID && read.ID == e.ID) 
       ..... 

這編譯和運行時,它在LEFT OUTER JOIN使用函數在數據庫中我想要的。