Преобразовать условную проекцию в булеву - PullRequest
2 голосов
/ 13 февраля 2012

У меня есть простой оператор case в моем запросе, который, по сути, говорит, что если счетчик подзапроса равен 1, возвращает false, иначе возвращает true. Запрос, сгенерированный NHibernate, является правильным, однако мне трудно получить логическое возвращаемое значение оператора case для преобразования в мой dto.

Вот мое ограничение

var restriction = Restrictions.Eq(Projections.SubQuery(QueryOver.Of(() => alias)
    .Select(Projections.Count(() => alias.Id))
    .Where(x => x.AddedBy == UserProvider.Current.UserName)
    .Where(() => alias.Item.Id == alias2.Id)), 1);

А вот и моя проекция

.Add(
    Projections.Conditional(restriction,
        Projections.Cast(NHibernateUtil.YesNo, Projections.Constant(false)),
        Projections.Cast(NHibernateUtil.YesNo, Projections.Constant(true))))
            .WithAlias(() => dto.CanApply))
)

Здесь свойство CanApply из моего dto является логическим значением. Я получаю ошибку {"The type System.Int32 can not be assigned to a property of type System.Boolean setter of Dto.CanApply"}.

Я перепробовал все, что мог придумать, чтобы заставить NHibernate преобразовать целое число в логическое значение.

Что мне не хватает?

Редактировать

Мне удалось решить эту проблему, создав собственный преобразователь результатов, унаследовав IResultTransformer и проверив каждый из псевдонимов, чтобы определить, является ли он причиной проблемы. Как только я нашел псевдоним преступника, я просто выдаю Convert.ToBoolean(tupleValue) и называю его днем.

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

1 Ответ

2 голосов
/ 15 мая 2012

Попробуйте указать тип в Projection.Constant.Как это:

.Add(
 Projections.Conditional(restriction,
    Projections.Constant(false, NHibernateUtil.Boolean)),
    Projections.Constant(true, NHibernateUtil.Boolean))))
        .WithAlias(() => dto.CanApply))
 )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...