【问题标题】:Using NHibernate Criteria to sum across multiple properties/columns使用 NHibernate Criteria 对多个属性/列求和
【发布时间】:2011-01-07 16:00:28
【问题描述】:

有谁知道如何使用 NHibernate 标准来表达下面的 SQL 语句?

SELECT SUM(Val1 + Val2) FROM SomeTable

似乎很简单,但我似乎无法找到一种方法来做到这一点,而不返回一个值数组,分别返回 Val1 + Val2 的总和,然后从数组中求和,我想避免这种情况。

【问题讨论】:

    标签: nhibernate criteria


    【解决方案1】:

    @Jaguar 在他的回答 NHibernate and the missing OperatorProjection 中提到的 cmets 博客文章是一种替代解决方案:

    session.CreateCriteria().SetProjection(
        Projections.Property<SomeType>(val => val.Id),
        Projections.Property<SomeType>(val => val.Duration),
        Projections.SqlFunction(
            new VarArgsSQLFunction("(", "+", ")"),
            NHibernateUtil.Double,
            Projections.Property<SomeType>(val => val.Duration),
            Projections.Constant(1)
        )
    ).List();
    

    所有功劳归Tomek

    这可能看起来像:

    Projections.Sum(
        Projections.SqlFunction(
            new VarArgsSQLFunction("(", "+", ")"),
            NHibernateUtil.Int32,
            Projections.Property<SomeTableType>(val => val.Val1),
            Projections.Property<SomeTableType>(val => val.Val2)
        )
    )
    

    尤其是VarArgsSQLFunction 很有用。

    【讨论】:

      【解决方案2】:

      好吧,在第 n 次阅读与这个确切问题有关的问题后,我决定编写一个不包括编写 SQL 的实现。

      您可以在http://savale.blogspot.com/2011/04/nhibernate-and-missing.html 上查看实现,您可以使用它编写代码:

      criteria.SetProjection(
                       new ArithmeticOperatorProjection("+",
                                       NHibernateUtil.Int32,
                                       Projections.Property("Prop1"), Projections.Property("Prop2")
                                                        )
                      );
      

      【讨论】:

      • 非常好,会试一试!
      【解决方案3】:

      我猜 Val1 和 Val2 是来自您的实体的属性值。在这种情况下,您可以编写自己的自定义 NHibernate.Criterion.ICriterion。在您的情况下,您只需实现方法 ToSqlString。

      【讨论】:

        【解决方案4】:

        或者您可以使用 HQL 来实现相同的目的。它让您可以对 .net 对象进行操作,然后相应地查询服务器。

        您可以按如下方式构建您的查询

        var hqlQuery= string.format(" select a.prop1 + a.prop2 from ClassA as a where a.Id={0}",val);
        
        return session.CreateQuery(hqlQuery).UniqueResult<double>();
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-03-14
          • 1970-01-01
          • 2015-07-26
          • 1970-01-01
          • 1970-01-01
          • 2010-12-20
          • 1970-01-01
          • 2023-03-05
          相关资源
          最近更新 更多