为什么这个查询抛出一个异常

本文关键字:一个 异常 查询 为什么 | 更新日期: 2023-09-27 17:53:34

我有一个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的成员。非空值类型的布尔值。'

当枚举

?

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

为什么这个查询抛出一个异常

当您比较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条件都为false。在这篇博客文章中有解释[免责声明:这篇文章是我的]

使用Enabled = NxEnabled ?? false作为替代。

打印错误—您需要双等号==:

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