我有一个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子句不是问题。
答案 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
});