Фильтрация по сравнению строк, обнуляемых - PullRequest
2 голосов
/ 18 октября 2011

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

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

1 Ответ

0 голосов
/ 18 октября 2011

Я пришел с рабочим ответом.

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

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
            )
     );

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

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

...