为什么此查询会抛出异常?

时间:2013-01-14 21:57:24

标签: c# linq-to-sql

我有一个User表,其中BIT NULL列名为NxEnabled,我无法更改。有些记录实际上在该列中包含NULL

我不想在C#中使用Nullable,因此在投影中将其与true进行比较是有意义的(代码是简化的,但这会产生相同的错误):

context.Users.Where(x => x.Id == 4)
             .Select(x => new 
                  { 
                      Id = x.Id,
                      Name = x.Name,
                      Enabled = x.NxEnabled == true
                  });

为什么此查询会抛出

  

InvalidOperationException:无法将null值分配给a   System.Boolean类型的成员,它是一个不可为空的值类型。

什么时候枚举?

编辑:抱歉打字错误。查询实际上更复杂,但where子句不是问题。

3 个答案:

答案 0 :(得分:4)

true.IsEnabled字段进行比较时,LINQ to SQL会将true作为参数传递给查询。问题在于翻译将返回NULL

SELECT [t0].[Id], [t0].[Name],
    (CASE 
        WHEN [t0].[NxEnabled] = @p0 THEN 1
        WHEN NOT ([t0].[NxEnabled] = @p0) THEN 0
        ELSE NULL
     END) AS [Enabled]
FROM [Users] AS [t0]

由于SQL92如何定义与NULL的比较方式,因此WHEN条件均为假。 在this blog post [免责声明:帖子是我的]

中对此进行了解释

使用Enabled = NxEnabled ?? false作为解决方法。

答案 1 :(得分:3)

错字 - 你需要双等于==

.Where(x => x.Id == 4)

答案 2 :(得分:0)

context.Users.Where(x => x.Id == 4)
             .Select(x => new Users()
                  { 
                      Id = x.Id,
                      Name = x.Name,
                      NxEnabled = x.NxEnabled ?? false
                  });