我有一个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
为什么?
答案 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);
诀窍是从集合中过滤掉可以包含错误值或真值的可空值(真值没有问题所以这主要是假值)