我正在使用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