2011-10-18 109 views
2

我正在使用nHibernate來搜索不匹配的字符串。過濾比較可空字符串

的模式是這樣的:

  • PlayerGroup有一個字段ExpectedPlaylistKey

  • Player有一個字段LastReportedPlaylistKey

  • 其中一個PlayerGroup有很多Players

我想執行一個查詢來查找所有與該組預期播放列表不匹配的播放器。

我的代碼如下:

PlayerGroup playerGroupAlias = null; 
Player playerAlias = null; 

var query = this.Session.QueryOver<Player>(() => playerAlias) 
         .JoinAlias(() => playerAlias.PlayerGroup,() => playerGroupAlias) 
         .Where(
           () => (playerGroupAlias.ExpectedPlaylistKey != playerAlias.CurrentlyReportedPlaylistKey) 
          ); 

我已經研究了生成的SQL,並且它使用這個where子句:

WHERE not (playergrou1_.ExpectedPlaylistKey = this_.CurrentlyReportedPlaylistKey) 

不幸的是,如果這些值之一爲NULL,則此即使其他值不爲null,也會返回false。

我該如何解決我的nHibernate查詢,所以它處理的情況下,如果任何字符串是NULL?

回答

0

我想出了一個可行的答案。

但是,考慮到問題的簡單性,這看起來非常笨拙的代碼。

var query = this.Session.QueryOver<Player>(() => playerAlias) 
         .JoinAlias(() => playerAlias.PlayerGroup,() => playerGroupAlias) 
         .Where(
           () => (
             (playerAlias.CurrentlyReportedPlaylistKey == null) 
              && 
             (playerGroupAlias.ExpectedPlaylistKey != null) 
            ) 
             || 
             (
             (playerAlias.CurrentlyReportedPlaylistKey != null) 
              && 
             (playerGroupAlias.ExpectedPlaylistKey == null) 
            ) 
             || 
             (
             playerGroupAlias.ExpectedPlaylistKey != playerAlias.CurrentlyReportedPlaylistKey 
            ) 

            ); 

正如你所看到的,我已經使出由五個比較lambda表達式以及其他五個布爾運算,所有要問的問題「不同這兩個字符串」?

我希望有一個更優雅的解決方案。