#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
)
);
Как вы можете видеть, я прибегнул к лямбда-выражению, состоящему из пяти сравнений, а также пяти других логических операций, и все это для того, чтобы задать вопрос «отличаются ли эти две строки«?
Я надеюсь, что есть более элегантное решение.