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

Ale*_*rio 5 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
                  });
Run Code Online (Sandbox Code Playgroud)

为什么这个查询会抛出一个

InvalidOperationException:无法将null值赋给System.Boolean类型的成员,该类型是非可空值类型.

什么时候枚举?

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

ist*_*iuk 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]
Run Code Online (Sandbox Code Playgroud)

由于 SQL92 定义了与 NULL 比较的工作方式,因此这两个WHEN条件都是 false。这篇博文对此进行了解释[免责声明:该帖子是我的]

Enabled = NxEnabled ?? false而是将其用作解决方法。