我正在使用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 <> '' 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 <> '' THEN strDate + ' ' + SUBSTRING(strTime, 1, 2) + ':' + SUBSTRING(strTime, 3, 2) END AS DateTime)
編輯: 現在我已經張貼此作爲CodePlex的問題。如果您有興趣,請投票。
https://entityframework.codeplex.com/workitem/2583
CSDL是一種不是存儲模型(SSDL)的概念模型。 CSDL中的查詢必須是有效的實體SQL,而SSDL中的查詢必須是數據庫的有效SQL。您必須在實體SQL中查找「Entity.SqlServer.SqlFunction.Stuff」的全名,或者(更好地)使用具有真實SQL的商店定義函數並將其映射爲在CSDL中運行。 – 2014-11-17 14:27:32
@LadislavMrnka謝謝你澄清CSDL/SSDL的差異。我可以創建一個可以調用「STUFF」函數的自定義函數,並將該函數放入SSDL中,但我希望能夠使用CSDL中已有的自定義函數中的「STUFF」函數。我上面列出的例子是非常裸露的骨頭,並沒有顯示我在CSDL中的完整功能。我在CSDL中編寫的函數確實理解一些內置的SQL函數,我希望它理解「STUFF」函數。 – goroth 2014-11-17 16:12:43