我正在使用nHibernate 3.3。我想这样执行SQL:nHibernate在现有查询中计数(*)
select COUNT(*) from (
SELECT YEAR(MeasureDateLocal) As [Year], MONTH(MeasureDateLocal) As [MONTH], DAY(MeasureDateLocal) As [DAY], sum(this_.RainCounterValue) as y3_
FROM DriverPeriphMeasure this_
WHERE this_.IdDriver = @p1
GROUP BY YEAR(MeasureDateLocal), MONTH(MeasureDateLocal), DAY(MeasureDateLocal)) s
但使用QueryOver或LINQ。 目前我有这个难看的片片代码:
var countQuery = Context.Session.CreateSQLQuery(
@"select COUNT(*) from
(SELECT YEAR(MeasureDateLocal) As [Year], MONTH(MeasureDateLocal) As [MONTH], DAY(MeasureDateLocal) As [DAY], sum(this_.RainCounterValue) as y3_
FROM DriverPeriphMeasure this_
WHERE this_.IdDriver = :driverID
GROUP BY YEAR(MeasureDateLocal), MONTH(MeasureDateLocal), DAY(MeasureDateLocal)) s")
.SetParameter<Guid>("driverID", driver);
int total = countQuery.UniqueResult<int>();
但我很想看到如何使用QueryOver做到这一点。 我设法撰写以下QueryOver:
var q3 = Context.Session.QueryOver<DriverPeriphMeasure>().Where(x => x.Driver.Id == driver)
.SelectList(list => list
.Select(Projections.SqlGroupProjection("YEAR(MeasureDateLocal) As [Year]", "YEAR(MeasureDateLocal)", new[] { "YEAR" }, new IType[] { NHibernateUtil.Int32 }))
.Select(Projections.SqlGroupProjection("MONTH(MeasureDateLocal) As [MONTH]", "MONTH(MeasureDateLocal)", new[] { "MONTH" }, new IType[] { NHibernateUtil.Int32 }))
.Select(Projections.SqlGroupProjection("DAY(MeasureDateLocal) As [DAY]", "DAY(MeasureDateLocal)", new[] { "DAY" }, new IType[] { NHibernateUtil.Int32 }))
);
但我不能找到一种方法将它设置为子查询。
任何方式,你可以重写这个没有内部'select'? QueryOver不擅长从任意表格表达式中进行选择... – 2012-07-21 15:43:07
我很害怕我无法删除内部选择:我需要对分组数据进行计数。 – ZmorzynskiK 2012-07-21 18:00:54
QueryOver不支持from子句中的表达式。 Linq没有这个限制。 – Firo 2012-07-23 10:03:23