2011-09-07 77 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語法完成嗎?