2010-07-25 10 views
2

Voici un exemple de scénario simple -NHibernate ICriteria - ordre par nombre de collection enfant?

Une 'balise' comporte de nombreuses 'questions'. Lorsque je reçois une liste de Tags, comment puis-je commander par le nombre de questions Tags en utilisant l'API Criteria?

Je l'ai déjà fait mais je n'ai pas touché NH depuis environ 4 mois et j'ai oublié ... des projections peut-être? Aidez-moi!!!

Merci

Répondre

1

Assis avec une nouvelle paire d'yeux et figured it out ... Les tags sont maintenant commandés par un propery sur la collection Question Tags (vues) .. qui a fait beaucoup plus dans mon domaine sence que la commande par le nombre d'enfants

public IList<Tag> GetTop(int numberOfTags) 
    { 
     using (ITransaction transaction = Session.BeginTransaction()) 
     { 

      DetachedCriteria detachedCriteria = DetachedCriteria.For<Tag>() 
        .CreateCriteria<Tag>(x => x.Questions) 
        .AddOrder<Question>(x => x.Views, Order.Desc) 
        .SetMaxResults(numberOfTags) 
        .SetProjection(Projections.Distinct(Projections.Id())); 

      IList<Tag> tags = Session.CreateCriteria<Tag>() 
       .SetFetchMode<Tag>(x => x.Questions,FetchMode.Join) 
       .Add(LambdaSubquery.Property<Tag>(x => x.Id).In(detachedCriteria)) 
       .SetResultTransformer(new DistinctRootEntityResultTransformer()) 
       .List<Tag>(); 

      transaction.Commit(); 
      return tags; 
     } 
    } 
0

Essayer:

var tags = Session.CreateCriteria(typeof(Tag)) 
        .AddOrder(Order.Asc("Tag.Question.Id") 
        .List<Tag>(); 

// If that does not work, try: 
var tags = Session.CreateCriteria(typeof(Tag)) 
        .CreateCriteria("Question", "TagQuestion", JoinType.InnerJoin) 
        .AddOrder(Order.Asc("TagQuestion.Id") 
        .List<Tag>(); 
  1. Ordering on joined columns.
  2. Ordering the query criteria.

Edit: À moins que vous décidez contre ou votre déjà à l'aise avec l'API critères, vous devriez jeter un oeil à l'une HQL ou NHibernate.Linq:

var tags = Session.Linq<Tag>() 
       .OrderBy(tag => tag.Question.Id) 
       .ToList(); 

Linq to NHibernate: a vast improvement.

+1

Pas exactement ce que je cherchais quelque chose de plus comme ceci: - (Qui échouerait) Session.Linq () .OrderBy (tag => tag.Questions.Count) .ToList(); –

Questions connexes