【发布时间】:2011-01-07 16:00:28
【问题描述】:
有谁知道如何使用 NHibernate 标准来表达下面的 SQL 语句?
SELECT SUM(Val1 + Val2) FROM SomeTable
似乎很简单,但我似乎无法找到一种方法来做到这一点,而不返回一个值数组,分别返回 Val1 + Val2 的总和,然后从数组中求和,我想避免这种情况。
【问题讨论】:
标签: nhibernate criteria
有谁知道如何使用 NHibernate 标准来表达下面的 SQL 语句?
SELECT SUM(Val1 + Val2) FROM SomeTable
似乎很简单,但我似乎无法找到一种方法来做到这一点,而不返回一个值数组,分别返回 Val1 + Val2 的总和,然后从数组中求和,我想避免这种情况。
【问题讨论】:
标签: nhibernate criteria
@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 很有用。
【讨论】:
好吧,在第 n 次阅读与这个确切问题有关的问题后,我决定编写一个不包括编写 SQL 的实现。
您可以在http://savale.blogspot.com/2011/04/nhibernate-and-missing.html 上查看实现,您可以使用它编写代码:
criteria.SetProjection(
new ArithmeticOperatorProjection("+",
NHibernateUtil.Int32,
Projections.Property("Prop1"), Projections.Property("Prop2")
)
);
【讨论】:
我猜 Val1 和 Val2 是来自您的实体的属性值。在这种情况下,您可以编写自己的自定义 NHibernate.Criterion.ICriterion。在您的情况下,您只需实现方法 ToSqlString。
【讨论】:
或者您可以使用 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>();
【讨论】: