【问题标题】:How to hide some fields using NHIbernate ICriteria?如何使用 NHIbernate ICriteria 隐藏某些字段?
【发布时间】:2012-05-22 16:24:18
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c# nhibernate nhibernate-criteria


    【解决方案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 纳入您的标准

    【讨论】:

    • 感谢您的回答我认为它会完成这项工作。这是我想问的一个问题:如何设置投影的别名?我的意思是我想要 Projections.Property("Title") : Projections.Constant("*********"));无论如何都有别名标题,所以我可以使用 Transformers.AliasToBean 填充类型
    • Projections.Constant("***...").As("Title")
    猜你喜欢
    • 2012-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-06
    • 1970-01-01
    相关资源
    最近更新 更多