Фильтрация при сравнении строк с нулевым значением

#nhibernate #queryover

#nhibernate #выполнение запроса

Вопрос:

Я использую 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, то это возвращает false, даже если другое значение не равно null.

Как я могу исправить свой запрос NHibernate, чтобы он обрабатывал случай, если любая строка имеет значение NULL?

Ответ №1:

Я придумал рабочий ответ.

Но, учитывая простоту проблемы, это выглядит как действительно неуклюжий код.

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

Как вы можете видеть, я прибегнул к лямбда-выражению, состоящему из пяти сравнений, а также пяти других логических операций, и все это для того, чтобы задать вопрос «отличаются ли эти две строки«?

Я надеюсь, что есть более элегантное решение.