NHibernate:使用表加入子查询(使用聚合)

时间:2014-08-08 09:18:38

标签: nhibernate subquery aggregation queryover

我有一张表格,其中包含多个地点之间机器移动的记录。

由于我只在列表中显示最新版本,因此我只读取了每台机器最新记录日期的数据行,直到现在为止。

Select * 
From records
INNER JOIN
    (Select max(processdate) as maxDate, machinetag, machineno 
    from records
    group by machinetag, machineno ) as lrcd
on records.machineTag = lrcd.machineTag and records.machineno = lrcd.machineno 
and records.processDate = lrcd.maxDate

我看过很多帖子,但我找不到任何解决方案。

如何使用queryover实现此方案?

很提前你很开心。 的Sascha

3 个答案:

答案 0 :(得分:0)

内部联接几乎总是可以重写为where子句和投影的组合。

像这样的东西(我在没有编译器的情况下写作,对不起,如果有任何错误):

Select 
    records.*,
    (select max(processdate) as maxdate
     from records
     where lrcd.machineno = records.machineno)
     -- add more projections if you need them
From records
where records.processDate =
    (select max(processdate) as maxDate 
    from records
    where lrcd.machineno = records.machineno) as lrcd

现在使用QueryOver很容易实现(子查询可以在投影或限制中实现)。

不要担心重复的代码 - 查询计划会为您优化它。

答案 1 :(得分:0)

此语句表示没有内部联接的语句:

    Select r.*
from records as r
where r.processDate =
   (Select max(processdate) as maxDate
    from records as lr
    where lr.machinetag = r.machinetag and
          lr.machineno  = r.machineno)

答案 2 :(得分:0)

现在我可以提供(可能)工作解决方案:

Dim r As Record = Nothing

Dim subquery = QueryOver.Of(Of Record)() _
                                         .Where(Function(rec) rec.R_MachineTag = r.R_MachineTag) _
                                          .And(Function(rec) rec.R_MachineNo = r.R_MachineNo) _
                                          .Select(Projections.Max(Of Record)(Function(rec) rec.R_ProcessDate)).Take(1)

Dim query = session.QueryOver(Function() r) _
                        .WithSubquery.WhereProperty(Function(rec) rec.R_ProcessDate).Eq(subquery) _
                        .List()

感谢cbp给我提示;)