Как скрыть некоторые поля с помощью NHIbernate ICriteria?

Вот сценарий, над которым я работаю: сейчас у нас есть оператор SQL, который выглядит следующим образом:

SELECT a.ID,a.MsgNumber,CASE WHEN @HasAccess=1 THEN Title ELSE '*********' END AS Title FROM Messages

Мы хотим, чтобы операторы могли видеть, зарегистрировано ли сообщение в системе, но не могут видеть заголовок, если они не авторизованы.

Я изменяю эту часть кода, чтобы мы могли использовать критерии NHibernate для получения того же результата (чтобы мы могли создавать динамические запросы в соответствии с фильтрами, которые выбирает пользователь). Я знаю, что могу использовать проекции для получения некоторых полей или постоянных значений из критериев, но не могу понять, как мне их объединить, чтобы делать то, что я хочу.

1 ответ

Решение

Похоже, @HasAccess - это параметр, передаваемый вашим кодом, а не значение, определяемое базой данных. Если это так, то самый простой способ сделать то, что вы хотите, - это изменить критерии в коде на основе значения, которое вы передадите в запросе, например:

var projections = Projections.ProjectionList()
        .Add(Projections.Id())
        .Add(Projections.Property("MsgNumber"))
        .Add(hasAccess ? Projections.Property("Title") : Projections.Constant("*********"));

var criteria = session.CreateCriteria<Message>()
        .Add(... your restrictions ...)
        .SetProjection(projections)
        .List<object[]>();

Однако если @HasAccess как-то определяется вашей базой данных, вы можете использовать:

Projections.Conditional(Restrictions.Eq("HasAccess", 1),
    Projections.Property("Title"),
    Projections.Constant("*********"))

Предполагая, что вы можете получить HasAccess в ваших критериях как-то

Другие вопросы по тегам