2011-09-07 45 views
0

我写博客TURIST所以第一部分的实体我有两个实体:相对于1地点和照片很多,所以每到一个地方可以有多个照片,但一张照片属于一个地点。NHibernate的QueryOver选择每个组实体

我的目标是创建总结:最后说3位,并与每一个地方,我想有一个照片(例如照片与下位ID,也没关系)。不仅具有照片的ID,但更多的信息(列),如照片标签,路径,照片等是很重要的。

在MS使用SQL 2008 SQL可以通过使用列函数来完成:

select top 3 * from 
(
SELECT  p.id, p.label, p.VisitDate, ph.id AS photo_id, ph.Label, ph.Path, 
RANK() OVER (PARTITION BY p.id ORDER BY ph.id) AS _rank 
FROM   place AS p INNER JOIN 
         photo AS ph ON p.id = ph.place_id 
) ranked 
where _rank = 1 
order by VisitDate desc 

或者,它可以解决,而排名:

SELECT  TOP (3) a.id AS ida, z.id AS idz, z.etykieta, z.sciezka, a.data_odwiedzenia 
FROM   place AS a INNER JOIN 
         photo AS z ON a.id = z.id_atrakcji 
and z.id in 
(
SELECT min(z.id) AS idz 
FROM photo z 
where z.id_atrakcji in (select top 3 a.id from place a order by a.data_dodania desc) 
group by z.id_atrakcji 
) 
ORDER BY a.data_odwiedzenia DESC 

我开始不排名写这个查询,但我被困住了。

summaryList = 
session.QueryOver(() => placeAlias) 
.JoinAlias(o => o.Photos,() => photoAlias) 
.SelectList(list => list 
.Select(() => placeAlias.Id).WithAlias(() => summaryAlias.PlaceId) 
.Select(() => placeAlias.Etykieta).WithAlias(() => summaryAlias.PlaceName) 
.Select(() => photoAlias.Etykieta).WithAlias(() => summaryAlias.PhotoLabel) 
.Select(() => photoAlias.Id).WithAlias(() => summaryAlias.PhotoId) 
) 
.OrderByAlias(() => placeAlias.VisitDate).Desc 
.WithSubquery.WhereProperty(x => x.Id).In(lastPlaces) 
.TransformUsing(Transformers.AliasToBean<PlacesSummary>()) 
.List<PlacesSummary>(); 

你能帮我吗?如何编写lastPlaces查询或可能有另一种方法?

问候, Macko

回答

1
var subquery = QueryOver.Of(() => photoAlias) 
    .Where(photo => photo.Place.Id == placeAlias.Id) 
    .Select(Projections.Max<Photo>(photo => photo.Id)); 

var summaryList = session.QueryOver(() => placeAlias) 
    .OrderBy(() => placeAlias.VisitDate).Desc 
    .JoinQueryOver(() => placeAlias.Photos,() => photoAlias) 
    .WithSubquery.WhereProperty(photo => photo.Id).Eq(subquery) 
    .SelectList(list => list 
     .Select(() => placeAlias.Id).WithAlias(() => summaryAlias.PlaceId) 
     .Select(() => placeAlias.Etykieta).WithAlias(() => summaryAlias.PlaceName) 
     .Select(() => photoAlias.Etykieta).WithAlias(() => summaryAlias.PhotoLabel) 
     .Select(() => photoAlias.Id).WithAlias(() => summaryAlias.PhotoId) 
    ) 
    .TransformUsing(Transformers.AliasToBean<PlacesSummary>()) 
    .List<PlacesSummary>(); 

不能测试它现在

0

这是行不通的,因为它应该,但你,这是非常接近:

summaryList = 
session.QueryOver(() => placeAlias) 
.OrderByAlias(() => placeAlias.VisitDate).Desc 
.JoinAlias(o => o.Photos,() => photoAlias) 
**.WithSubquery.WhereProperty(()=> photoAlias.Id).Eq(subquery)** 
.SelectList(list => list 
.Select(() => placeAlias.Id).WithAlias(() => summaryAlias.PlaceId) 
.Select(() => placeAlias.Etykieta).WithAlias(() => summaryAlias.PlaceName) 
.Select(() => photoAlias.Etykieta).WithAlias(() => summaryAlias.PhotoLabel) 
.Select(() => photoAlias.Id).WithAlias(() => summaryAlias.PhotoId)) 
.TransformUsing(Transformers.AliasToBean<PlacesSummary>()) 
.Take(3) 
.List<PlacesSummary>(); 

它的不同之处仅一行.WithSubquery其中orginally它是指将代替它应该是指照片。现在,它的工作和它产生的SQL语句:

SELECT TOP (3) this_.id as y0_, this_.PlaceName as y1_, photoalias1_.PhotoName as y2_, photoalias1_.id as y3_ 
FROM [place] this_ inner join [photo] photoalias1_ on this_.id=photoalias1_.id_place 
WHERE photoalias1_.id = (SELECT min(this_0_.id) as y0_ FROM [photo] this_0_ WHERE this_0_.id_place = this_.id) 
ORDER BY this_.DateVisit desc 

它的工作很好,但我还有一个问题:

如何QueryOver这样的SQL重写:

SELECT min(id) 
FROM photo 
where id in (... it doesn't matter what's here ...) 
group by place_id 

所以我只想名单照片的ID(仅列)和该查询将被用作在另一queryover子查询。可以通过QueryOver语法完成吗?