这是我正在处理的一个场景:现在我们有一个如下所示的SQL语句:
SELECT a.ID,a.MsgNumber,CASE WHEN @HasAccess=1 THEN Title ELSE '*********' END AS Title FROM Messages
我们希望操作员能够查看是否在系统中注册了邮件,但如果未经授权则无法查看标题。
我正在更改这部分代码,因此我们可以使用NHibernate标准生成相同的结果(因此我们可以根据用户选择的过滤器生成动态查询)。 我知道我可以使用投影从标准中获取某些字段或常量值,但无法弄清楚我应该如何将它们组合起来做我想要的。
答案 0 :(得分: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纳入您的标准