如何使用LINQ to SQL和DbLinq选择空值?

4

当我

bool? isApproved = null;
db.Table.Where(item => item.IsApproved == isApproved).Count();

最后一行的值为0。但是当我...
db.Table.Where(item => item.IsApproved == null).Count();

数值是正确的。

我正在使用SQLiteDbLinqDbMetal


可能是重复的问题:如何在Entity Framework中查询空值? (注意,该解决方案适用于L2SQL和L2EF) - BlueRaja - Danny Pflughoeft
1
那你不是在使用Linq2Sql吗? - Magnus
@Magnus Linq2Sql和DbLinq是互斥的吗?我认为在使用DbLinq时必须使用Linq2Sql。 - Jader Dias
1
@Jader:DbLinq和Linq-to-SQL并不相同。Linq-to-SQL是指微软的一种特定技术。 - BlueRaja - Danny Pflughoeft
@BlueRaja 我知道。我相信在没有Linq-to-SQL的情况下使用DbLinq是不可能的。 - Jader Dias
显示剩余2条评论
5个回答

2

我曾看到过以下做法:

 db.Table.Where(
            item => item.IsApproved.HasValue == isApproved.HasValue && 
            (!item.IsApproved.HasValue || item.IsApproved.Value==isApproved.Value ) 
 ).Count();

我添加了一个类似的答案,我正在使用。但是你的也同样好。 - Jader Dias

1

嗯,我以前遇到过这个问题,我记得问题在于将LINQ查询转换为SQL语句。

第二个表达式在SQL中有一个等号: Where IsAproved is null

但是第一个表达式没有,因为它是数据库中的值与C#可空变量之间的比较。

为了解决这个问题,我建议尝试:

db.Table.Where(item => isApproved != null ? item.IsApproved == isApproved.Value 
                                          : item.IsApproved == null).Count();

1

查看这篇文章

你应该使用

db.Table.Where(item => item.IsApproved.Equals(isApproved)).Count();

那么你应该联系 微软 并让他们知道这种行为是多么可怕。


0

我不知道性能损失情况,但它可以工作

bool? isApproved = null;
db.Table.Where(item => item.IsApproved == isApproved || 
                     !(item.IsApproved.HasValue || isApproved.HasValue))
    .Count();

-1
尝试:

db.Table.Where(item => item.IsApproved == isApproved.Value).Count();


1
当isApprove为空时,这将会崩溃。 - Nix

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接