0

私はツーリスト ブログの一部を書いているので、2 つのエンティティがあります。場所と写真は 1 対多の関係にあるため、すべての場所に複数の写真を含めることができますが、1 つの写真は 1 つの場所に属します。

私の目的は、要約を作成することです。最後に追加された 3 つの場所と、すべての場所に 1 枚の写真が必要です (たとえば、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 queryover を記述する方法、または別のアプローチがある可能性がありますか?

よろしく、マッコ

4

2 に答える 2

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>();

今はテストできません

于 2011-09-07T15:47:02.520 に答える
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>();

1 行だけが異なります。WithSubquery では、本来 は場所を参照するのではなく、写真を参照する必要があります。現在は機能しており、次の 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

それはうまく機能していますが、別の質問があります:

このような SQL を QueryOver で書き換える方法:

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

したがって、写真IDのリストのみ(列のみ)が必要で、このクエリは別のクエリオーバーでサブクエリとして使用されます。QueryOver 構文で実行できますか?

于 2011-09-08T08:03:16.697 に答える