5

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

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

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

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

InvalidOperationException:空值不能分配给 System.Boolean 类型的成员,该类型是不可为空的值类型。`

什么时候枚举?

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

4

3 回答 3

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条件都是错误的。这篇博文中对此进行了解释[免责声明:该帖子是我的]

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

于 2013-01-14T22:02:51.323 回答
3

错字——你需要双等号==

.Where(x => x.Id == 4)
于 2013-01-14T21:59:59.613 回答
0
context.Users.Where(x => x.Id == 4)
             .Select(x => new Users()
                  { 
                      Id = x.Id,
                      Name = x.Name,
                      NxEnabled = x.NxEnabled ?? false
                  });
于 2013-01-14T22:00:47.653 回答