有没有人知道如何使用NHibernate标准表达以下SQL语句?
SELECT SUM(Val1 + Val2) FROM SomeTable
看起来很简单,但AFAIK我似乎无法找到一种方法来做到这一点而不返回一个值数组,Val1 + Val2的总和单独然后从数组求和,我想避免。
答案 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>();