【问题标题】:EDMX generates Nullable bool instead of boolEDMX 生成 Nullable bool 而不是 bool
【发布时间】:2014-07-30 21:09:54
【问题描述】:

我编写了一个返回一个选择的简单存储过程。

当我更新了我的EDMX model 并添加了新的存储过程后,我想知道返回的 Result 有一个 Nullable bool(在存储过程中我总是返回 0 或 1)。

为什么它会生成 Nullable bool 而不是 bool?以及如何更改存储过程以使其生成 bool?

这里是存储过程(这不是真正的存储过程,只是为了演示问题):

ALTER PROCEDURE [dbo].[TestBool]
AS
BEGIN
    SET NOCOUNT ON;

    SELECT  Title,
            CONVERT(BIT, IIF([Address] = 'America', 1, 0)) IsAmerica,
            CONVERT(BIT, IIF(Duration > 100, 1, 0)) IsLong
    FROM    dbo.Events
    WHERE   UserId > 10
END

Address 不为空,而Duration 为空(但这并不重要,因为这两个值都生成为 Nullable bool)。

这是EDMX 结果的图像。

提前致谢:)

【问题讨论】:

  • 尝试在您的 Convert 周围添加一个 IsNull 函数和一个备用值。 IsNull(Convert..., false)
  • @kidshaw 谢谢。你是对的,如果我添加 ISNULL,它会起作用。但为什么?我写了一个不为空的值...所以它不应该有 ISNULL...
  • 我认为,您需要明确说明,您返回的不是空值。我很确定,如果您使用外部查询并添加诸如 where IsAmerica is not null 之类的 where 条件,那也将起作用。
  • @Rahul 不,我刚刚尝试过,如果我将它添加到 where 子句,它仍然可以为空 bool。
  • 奇怪!不确定 EF,但您可以尝试我的答案中的替代方法。

标签: c# sql sql-server entity-framework stored-procedures


【解决方案1】:

单独使用 ConvertCast 并不能保证 edmx 上的输出不可为空。你需要用 isnull() 包裹整个东西,如下所示:

isnull(cast(case when myBooleanField is not null then 1 else 0 end as bit),0) as IsBooleanValue

【讨论】:

    【解决方案2】:

    不是解决您的问题,而是替代方案。如果你使用一个表变量并返回它而不是像

    ALTER PROCEDURE [dbo].[TestBool]
    AS
    BEGIN
    DECLARE @tab table (
    Title varchar(100) not null,
    IsAmerica bit not null,
    IsLong bit not null
    );
    
        SET NOCOUNT ON;
    
        INSERT INTO @tab(Title,IsAmerica,IsLong)
        SELECT  Title,
                CONVERT(BIT, IIF([Address] = 'America', 1, 0)) IsAmerica,
                CONVERT(BIT, IIF(Duration > 100, 1, 0)) IsLong
        FROM    dbo.Events
        WHERE   UserId > 10
    
    
        SELECT Title,
               IsAmerica,
               IsLong 
               FROM @tab;
    END
    

    【讨论】:

    • 是的,正如你所说,这不是我的问题,而是解决它的方法。谢谢,但我的问题不是替代解决方案,我有很多解决方案:)。只是想了解为什么...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多