2014-11-03 53 views
4

我正在使用EF 6.1並希望在EDMX文件的CSDL部分創建一個可以調用內置於SQL 2012中的STUFF函數的自定義函數。
我擁有的非常簡單。 (注意:這假定時間是HHMM沒有冒號)如何讓Entity Framework 6在CSDL中使用SQL STUFF函數?

<Function Name="StringToDate" ReturnType="DateTime"> 
    <Parameter Name="strDate" Type="String" /> 
    <Parameter Name="strTime" Type="String" /> 
    <DefiningExpression> 
     CAST(CASE WHEN strDate &lt;&gt; '' THEN strDate + ' ' 
      + STUFF(strTime, 3, 0, ':') END AS DateTime) 
    </DefiningExpression> 
</Function> 

上面的代碼工作,如果我刪除了「STUFF」命令,但與「STUFF」命令我得到「‘東西’不能被解析爲有效類型或功能「。

我可以在LINQ to Entity中使用「Entity.SqlServer.SqlFunctions.Stuff」,但不能在CSDL中使用。

注意:我使用STUFF命令在時間變量中的第二個和第三個字符之間插入一個冒號。

編輯:「工作」
這是工作,但我仍然想知道如何在CSDL中使用STUFF(如果可能)。

CAST(CASE WHEN strDate &lt;&gt; '' THEN strDate + ' ' + SUBSTRING(strTime, 1, 2) + ':' + SUBSTRING(strTime, 3, 2) END AS DateTime) 



編輯: 現在我已經張貼此作爲CodePlex的問題。如果您有興趣,請投票。
https://entityframework.codeplex.com/workitem/2583

+0

CSDL是一種不是存儲模型(SSDL)的概念模型。 CSDL中的查詢必須是有效的實體SQL,而SSDL中的查詢必須是數據庫的有效SQL。您必須在實體SQL中查找「Entity.SqlServer.SqlFunction.Stuff」的全名,或者(更好地)使用具有真實SQL的商店定義函數並將其映射爲在CSDL中運行。 – 2014-11-17 14:27:32

+0

@LadislavMrnka謝謝你澄清CSDL/SSDL的差異。我可以創建一個可以調用「STUFF」函數的自定義函數,並將該函數放入SSDL中,但我希望能夠使用CSDL中已有的自定義函數中的「STUFF」函數。我上面列出的例子是非常裸露的骨頭,並沒有顯示我在CSDL中的完整功能。我在CSDL中編寫的函數確實理解一些內置的SQL函數,我希望它理解「STUFF」函數。 – goroth 2014-11-17 16:12:43

回答

1

在數據庫提供程序中聲明的函數通常在提供程序的名稱空間下可用。因此,如果這是一個普通的Entity SQL查詢,您應該能夠在它之前調用STUFF(),例如添加SqlServer。 SqlServer.STUFF(strTime,3,0,':')。

但是,模型定義函數的主體中的實體SQL只能引用其他規範函數或其他模型定義的函數,即模型定義的函數不能通過引用提供者特定函數使提供者特定。

這是一個選擇採用的限制。當您的應用程序執行LINQ查詢時,您可以執行提供程序特定的函數,因爲您的應用程序已經依賴於具有概念和存儲模式以及映射規範的完整模型。另一方面,模型定義的函數是概念模型的一部分,它應該是獨立的:您應該能夠交換提供者,存儲架構或映射規範以適應不同的概念模型,而不會使概念模型無效。因此,在概念模型中定義的東西不能依賴於其他地方定義的東西。

解決方法:

我做了一些實驗,並用這種簡單的方式使用應在整個提供商合作,只有規範的功能,以模擬SQL Server的東西()走了過來。通過指定概念模型的命名空間,你可以從你自己的模型定義的函數中使用類似的東西,例如Model1.Stuff(strTime,3,0,':')

<Function Name="Stuff" ReturnType="String"> 
    <Parameter Name="character_expression" Type="String" /> 
    <Parameter Name="start" Type="Int32" /> 
    <Parameter Name="length" Type="Int32" /> 
    <Parameter Name="replaceWith_expression" Type="String" /> 
    <DefiningExpression> 
    Left(character_expression,start-1) 
    + replaceWith_expression 
    + Substring(character_expression, start + length, Length(character_expression)) 
    </DefiningExpression> 
</Function> 
+0

它仍然不允許我在CSDL函數內調用STUFF命令。在LINQ中,我已經可以使用Entity.SqlServer.SqlFunctions.Stuff作爲MS SQL STUFF命令。關於你的功能的好處是,它可以在各個提供商中使用。 – goroth 2014-12-12 02:52:27

+0

我在第三段填寫了一些細節。雖然理論上可以取消限制,但存在限制的設計相關原因。 – divega 2014-12-16 18:14:52

相關問題