0

这是我正在处理的一个场景:现在我们有一个 SQL 语句,如下所示:

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

我们希望操作员能够看到消息是否在系统中注册,但如果他们未经授权则看不到标题。

我正在更改这部分代码,以便我们可以使用 NHibernate 标准来生成相同的结果(因此我们可以根据用户选择的过滤器生成动态查询)。我知道我可以使用投影从标准中获取一些字段或常量值,但无法弄清楚我应该如何将它们组合起来做我想做的事情。

4

1 回答 1

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 纳入您的标准

于 2012-05-22T08:24:18.273 回答