如何在linq到NHibernate中使用可为空布尔值的if条件

如何在linq到NHibernate中使用可为空布尔值的if条件,linq,nhibernate,nullable,linq-to-nhibernate,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(); 为什么?我不知道为什么

我有一个
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();

为什么?

我不知道为什么LINQ查询会生成case语句,这真的很奇怪

但我个人不喜欢使用可为空布尔值的方法

布尔值有两个值,true或false。当你使它为空时,你就给了它第三个可能的值

在这种情况下,我认为最好使用枚举

我假设“Sex”代表“Male”/“femal”,在这种情况下,我认为解决这个问题的更好方法是使用如下枚举:

public enum SexEnum
{
   Unspecified = 0,
   Male = 1,
   Female = 2
}
它还使您的代码更具描述性:

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

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

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

诀窍是从应该包含假值或真值的集合中筛选出可为空的值(真值没有问题,因此这主要是针对假值)

感谢您的解决方案。但是这个问题中的
Sex
属性就是一个例子。我的基本问题是生成查询的类型。我检查了这个示例,因为我没有意识到这个问题,我可以说他确实存在一些解决方法:。其中(x=>x.IsActive.HasValue&&x.IsActive==false)@Adam:I khow,但我希望找到更好的解决方案,你在评论“我的基本问题是生成查询的类型”中写道你能详细说明这一点吗。正如我所看到的,所描述的问题只存在于布尔类型。@Adam:我的问题是两者兼而有之。我评论的目的是没有用的
Enum
。我需要更好地解决这个问题,当然你的解决方案是正确的。我认为你没有任何可能解决这个问题。对我来说,nhibernate有bug,因为他错误地生成了sql,我看到了2个选项:修改的nhibernate代码;)或者在Where语句中使用HasValue
if (dto.Sex != null)
    q = q.Where(p => p.Sex == dto.Sex && p.Sex != null);