微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – 如何让Entity Framework 6在CSDL中使用SQL STUFF函数?

我正在使用EF 6.1,并希望在EDMX文件的CSDL部分中创建一个自定义函数,该部分可以调用sql 2012中内置的STUFF函数.
我拥有的很简单. (注意:这假定时间是没有冒号的HHMM)

<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,':') END AS DateTime)
    </DefiningExpression>
</Function>

如果我删除“STUFF”命令但是使用“STUFF”命令我得到“’STUFF’无法解析为有效的类型或函数,上面的代码就有效.”

我可以在LINQ to Entity中使用“Entity.sqlServer.sqlFunctions.Stuff”,但在CSDL中却没有.

注意:我正在使用STUFF命令在时间变量中的第2个和第3个字符之间插入冒号.

编辑:“解决
这是解决方法,但我仍然想知道如果可能的话如何在CSDL中使用STUFF.

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

编辑:
目前我已将此作为codeplex上的问题发布.如果您有兴趣,请投票.
https://entityframework.codeplex.com/workitem/2583

解决方法

数据库提供程序中声明的函数通常在提供程序的命名空间下可用.因此,如果这是一个正常的Entity SQL查询,您应该能够调用STUFF()在它之前添加sqlServer,例如sqlServer.STUFF(strTime,’:’).

但是,模型定义函数体中的实体sql只能引用其他规范函数或其他模型定义函数,即模型定义函数不能通过引用提供者特定函数而成为特定于提供者的函数.

这是一个选择采用的限制.当您的应用程序执行LINQ查询时,您可以执行特定于提供程序的函数,因为您的应用程序已经依赖于具有概念和存储架构以及映射规范的完整模型.另一方面,模型定义的函数是概念模型的一部分,它应该是自包含的:您应该能够为不同的模型交换提供者,存储模式或映射规范,而不会使概念模型无效.因此,概念模型中定义的事物不能依赖于其他地方定义的事物.

解决方法

我做了一些实验,并提出了这种天真的方式来模拟sql Server的Stuff(),只使用应该跨提供程序工作的规范函数.您可以通过指定概念模型的名称空间来使用您自己的模型定义函数中的类似内容,例如: Model1.Stuff(strTime,’:’)

<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>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐