如何在linq中使用nullable boolean的条件到NHibernate

时间:2012-03-26 09:50:44

标签: linq nhibernate nullable linq-to-nhibernate

我有一个Person类,Sex属性可以为空。

public class Person 
{
    public bool? Sex {get; set;}
}

我有一个linq对NHibernate的查询。

var q = SessionInstance.Query<Person>();

if (dto.Sex != null)
    q = q.Where(p => p.Sex == dto.Sex);

return q.ToList();

现在,如果dto.Sex的值等于true,则结果是正确的。

但是如果dto.Sex的值等于false结果不正确,因为结果包含Sex为false或null的人。

我查看了此查询的分析器:

select * from Person_Person person0_
where  case
             when person0_.Sex = 1 then 1
             else 0
           end = case
                   when 0 /* @p0 */ = 1 then 1
                   else 0
                 end

为什么?

2 个答案:

答案 0 :(得分:0)

我不知道为什么LINQ查询会生成一个案例陈述,这真的很奇怪......

但我个人并不喜欢可以为空的布尔值。

布尔值有2个值,true或false。你把它变为可空的那一刻,你就会给它第三个可能的价值。

在这样的场景中,我认为使用Enum会更好。

我认为&#39;性别&#39;是为了男性&#39; /&#39;女性&#39;,在这种情况下,我认为更好的方法是解决这个问题:

public enum SexEnum
{
   Unspecified = 0,
   Male = 1,
   Female = 2
}

它使您的代码更具描述性:

var males = session.Query<Person>().Where(x => x.Sex == SexEnum.Male);

答案 1 :(得分:0)

这是nhibernate linq提供程序中的一个错误,其解决方法如下:

if (dto.Sex != null)
    q = q.Where(p => p.Sex == dto.Sex && p.Sex != null);

诀窍是从集合中过滤掉可以包含错误值或真值的可空值(真值没有问题所以这主要是假值)