加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 22:09:37 所属栏目:百科 来源:网络整理
导读:我正在使用EF 6.1,并希望在EDMX文件的CSDL部分中创建一个自定义函数,该部分可以调用SQL 2012中内置的STUFF函数. 我拥有的很简单. (注意:这假定时间是没有冒号的HHMM) Function Name="StringToDate" ReturnType="DateTime" Parameter Name="strDate" Type="S
我正在使用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>

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读