2010-12-04 90 views
0

J'utilise NHibernate pour une application Web. J'ai un modèle comme celui-ci:Sous-requête pour récupérer une propriété 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() { } 
} 

Je voudrais savoir, comment récupérer la propriété de collection « LastOffers » avec un sous-requête HQL? Je veux aller le chercher avec les 10 dernières offres. J'ai ma maquette mappée correctement mais je ne connais pas le sintaxe pour faire une sous-requête récupérer cette propriété.

Aujourd'hui, je suis en utilisant une commande comme ceci pour aller chercher mes 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>(); 
     } 

Merci!

Répondre

1

En fonction de la description que vous avez fournie, je suppose que vous devez charger un ensemble de produits avec les derniers volumes préchargés, joints aux produits par FK. Le code ci-dessous doit faire ceci:

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

Pas testicules, mais idée est que nous nous associons à deux tables et le résultat sera « effondrés » à chaque ligne de produit (par DistinctRootEntityResultTransformer)

Désolé que l'exemple n'est pas en HQL - je préfère Criterias et QueryOver > comme plus stable.

+0

Bonjour Génie, Merci pour l'awser. En fait, DistinctRootEntityResult doit résoudre mon problème :), mais est-il possible d'extraire la propriété avec les 10 premiers enregistrements et d'ordonner par id desc? Je veux que cela améliore la performance, car j'aurai beaucoup d'offres par produit. Merci encore! –

+0

@Felipe, je n'ai jamais utilisé cette fonctionnalité, mais AFAIK il est soutenu par NH. Essayez de jouer avec le paramètre fetchmode dans un fichier HBM de votre entité. – Genius