2010-12-04 1 views
0

私はWebアプリケーションにNHibernateを使用しています。私はHQLのサブクエリで「LastOffers」コレクション・プロパティを取得する方法を、知っていただきたいと思いプロパティを取得するためのサブクエリNHibernate

public class ProductViewModel { 
    public virtual int Id { get; set; } 
    /* others simple properties */ 

    public virtual IList<OfferViewModel> LastOffers { get; set; } 

    public ProductViewModel() { } 
} 
public class OfferViewModel { 
    public virtual string UserName { get; set; } 
    public virtual decimal Prince { get; set; } 

    public OfferViewModel() { } 
} 

:私はこのようなモデルがありますか?私はトップ10の最後のオファーでそれを取りたいです。私のモデルは正しくマップされていますが、このプロパティをサブクエリでフェッチするsintaxはわかりません。

今日、私は私のViewModelを取得するために、このようなコマンドを使用しています:

public IList<ProductViewModel> GetProductsForSalles() 
     { 
      return 
       Session.CreateQuery(@"select p.Id as Id, 
              p.Name as Name, 
              p.Price as Price, 
              p.Price as Date 
              /* FETCH LastOffers? */ 
             from Product p 
             where p.Active=true and (p.Status=:Status) 
             order by a.Date asc") 
        .SetParameter("Status", Status.Started) 
        .SetMaxResults(50) 
        .SetResultTransformer(Transformers.AliasToBean<ProductViewModel>()) 
        .List<ProductViewModel>(); 
     } 

感謝を!

答えて

1

あなたが提供した説明に基づいて、FKによって製品に加わったプリロード済みlastoffersを持つ一連の製品をロードする必要があると思います。

return Session.CreateCriteria(typeof(ProductViewModel), "p") 
    .CreateCriteria("p.LastOffers", "lastoffers") 
    .SetResultTransformer(new NHibernate.Transform.DistinctRootEntityResultTransformer()) 
    .Add(Restrictions.Eq("p.Active", true)) 
    .Add(Restrictions.Eq("p.Status", Status.Started)) 
    .SetMaxResults(50) 
    .List<ProductViewModel>(); 

ない精巣を、しかし、アイデアは例がその

申し訳ありませんが(DistinctRootEntityResultTransformerで)我々は2つのテーブルを結合し、その結果、製品の各行に「崩壊」されるということです。以下のコードは、これを行う必要がありますHQLにはありません - 私はより安定したCriteriasとQueryOver <を好む。

+0

Hello Genius、awserに感謝します。実際には、DistinctRootEntityResultは私のproblemaを解決します:)。しかし、トップ10のレコードとid descの順序でプロパティをフェッチする方法はありますか?私はこれがパフォーマンスを向上させたいと思っています。なぜなら、製品ごとにたくさんのオファーがあるからです。再度、感謝します! –

+0

@Felipe、私はこの機能を使用したことはありませんが、AFAIKはNHによってサポートされています。エンティティのHBMファイルでfetchmodeパラメータを使って試してみてください。 – Genius

関連する問題