2012-03-26 46 views
3

可空布爾我有一個PersonSex屬性爲空如何使用。如果條件在LINQ to NHibernate的

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結果是不正確的,因爲結果是包含人,性是虛假或無效。

我檢查這個查詢分析器:

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 

爲什麼?

+1

我檢查這個例子監守我沒有意識到的那的問題,我可以說,他確實存在一些HYM解決方法:。凡(X => x.IsActive.HasValue && x.IsActive ==假) – 2012-03-27 21:14:16

+0

@Adam:我KHOW,但我期待爲更好的解決方案 – Ehsan 2012-03-28 09:13:57

+0

你在評論中寫道:「我的基礎問題是生成查詢的類型」,能否詳細說明這一點。正如我所見,所描述的問題只存在於bool類型中。 – 2012-03-29 17:55:27

回答

0

我不知道爲什麼LINQ查詢生成一個case語句,這真是奇怪......

但我個人不喜歡一個可空布爾值的方法。

一個布爾具有2倍的值,真或假。當你讓它爲空時,你會給它第三個可能的值。

在這樣的情況下,我認爲這是更好地使用枚舉。

我認爲「性」是「男」 /「女」,在這種情況下,我認爲解決問題的更好的方法是一個枚舉,如:

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

它使你的代碼更描述性好:

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

感謝您的解決方案。但是這個問題中的「性別」屬性是例如。我的基地問題是在生成的查詢類型。 – Ehsan 2012-03-26 10:52:34

0

這是NHibernate的LINQ提供程序中的錯誤,併爲它的解決方法將是這樣的:

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

訣竅是從它應該包含虛假的值或真值設定過濾掉空的值(真值有沒有問題,所以這主要是針對假值)