使用NHibernate Criteria来汇总多个属性/列

时间:2011-01-07 16:00:28

标签: nhibernate criteria

有没有人知道如何使用NHibernate标准表达以下SQL语句?

SELECT SUM(Val1 + Val2) FROM SomeTable

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

4 个答案:

答案 0 :(得分:5)

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

您可以查看http://savale.blogspot.com/2011/04/nhibernate-and-missing.html上可以编写的实现:

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

答案 1 :(得分:5)

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

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 :(得分:1)

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

答案 3 :(得分:0)

或者您可以使用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>();