如何使用NHIbernate ICriteria隐藏一些字段?

时间:2012-05-22 07:30:13

标签: c# nhibernate nhibernate-criteria

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

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

我们希望操作员能够查看是否在系统中注册了邮件,但如果未经授权则无法查看标题。

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

1 个答案:

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