EF 6.1 标量值函数数据库优先

Posted

技术标签:

【中文标题】EF 6.1 标量值函数数据库优先【英文标题】:EF 6.1 Scalar-Valued Functions Database First 【发布时间】:2014-12-10 03:11:40 【问题描述】:

我的应用程序是 c# MVC5,使用 EF 6.1。使用 Database First 导入表和函数。我可以在 DALModel.Store / Stored Procedures / Functions(灰色)下列出的模型(emdx)浏览器中看到函数。

我正在尝试使用以下功能:

using (var ctx = new DALEntities())

    int? result = ctx.fn_TotalClient(MemberRepository.AllowedCId, fromDate, toDate);
    return (result != null ? result.Value : 0);

我无法解析 fn_TotalClient

非常感谢您的建议。

【问题讨论】:

EntityFramework 6.1.2 social.msdn.microsoft.com/Forums/en-US/…987654321@中仍然存在的老问题 很高兴您找到了解决方案。只想评论一下,使用可为空的 int 的更好方法是检查其 HasValue 属性:return (result.HasValue ? result.Value : 0); 【参考方案1】:

显然我不能在我的模型中直接使用标量值函数;我在这个博客http://programmaticponderings.wordpress.com/2012/11/22/first-impressions-of-database-first-development-with-entity-framework-5-in-visual-studio-2012/找到了解决方案。

但是,我使用了另一种方法,将函数重新开发为表值函数,然后使用 FirstOrDefault() 来获取结果值。

希望这可以帮助面临同样问题的人。

【讨论】:

【参考方案2】:

嗯,你需要修改 SQL 来将单值/标量值转换为表值函数,然后它才能工作。

原来的标量函数不起作用

CREATE FUNCTION [dbo].[GetSha256]
(
    -- Add the parameters for the function here
    @str nvarchar(max)
)
RETURNS VARBINARY(32)
AS
BEGIN
    RETURN ( SELECT * FROM HASHBYTES('SHA2_256', @str) AS HASH256 );
END -- this doesn't work.

标量函数 -> 转换为表值函数,它可以工作

CREATE FUNCTION [dbo].[GetSha2561]
(
    -- Add the parameters for the function here
    @str nvarchar(max)
)
RETURNS  @returnList TABLE (CODE varbinary(32))
AS
BEGIN

    INSERT INTO @returnList
    SELECT HASHBYTES('SHA2_256', @str);

    RETURN; -- This one works like a charm.

END

【讨论】:

以上是关于EF 6.1 标量值函数数据库优先的主要内容,如果未能解决你的问题,请参考以下文章

为啥标量值函数会因空参数而失败?

从标量值函数返回变量

在 MSSM 中使用标量值函数和来自 2 个表的数据

在 SQL 中调用标量值函数

具有标量值函数的可变长度 NVARCHAR

为啥 SQL Server 标量值函数变慢?