2010-12-04 4 views
0

웹 응용 프로그램에 NHibernate를 사용하고 있습니다. 나는이 같은 모델을 가지고 :속성 가져 오기 하위 쿼리 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() { } 
} 
내가 어떻게 HQL 하위 쿼리와 함께 "LastOffers"컬렉션 속성을 가져, 알고 싶습니다

? 나는 10 가지 마지막 제안으로 그것을 가져오고 싶다. 내 모델이 올바르게 매핑되어 있지만 하위 속성을 가져올 sintax를 알지 못합니다.

오늘은 내 뷰 모델을 가져 오기 위해이 같은 명령을 사용하고 있습니다 :

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가 제품에 가입 한 사전로드 된 마지막 제공 상품을로드해야합니다.

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에 의해) 우리는 두 개의 테이블을 조인하고 결과가 제품의 각 행에 '붕괴'될 것입니다 : 아래 코드는이 작업을 수행해야 HQL에 없습니다 - 나는 더 안정적인 Criterias와 QueryOver <을 선호합니다.

+0

Hello Genius, awser에게 감사드립니다. 사실, DistinctRootEntityResult 내 문제를 해결할 수 shoul :),하지만 거기에 상위 10 개 레코드와 ID desc에 의해 순서와 속성을 가져 오는 방법은 무엇입니까? 나는 제품마다 많은 제안을 할 것이기 때문에 이것이 performace를 향상 시키길 원한다. 다시 한 번 감사드립니다! –

+0

@Felipe, 필자는이 기능을 한번도 사용하지 않았지만, NH가 AFAIK를 지원했습니다. 엔티티의 HBM 파일에서 fetchmode 매개 변수로 재생 해보십시오. – Genius