我正在使用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