Как скрыть некоторые поля с помощью 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 в ваших критериях как-то