2009-11-07 6 views
0

je une entité « personne » une personne a une collection d'amis (aussi entités personne)NHibernate lambdas JOINTES collection ordonnée

Je veux obtenir les 10 premiers amis d'une personne en particulier, ordonnée par LatestLogin.

Mon meilleur effort:

public static IList<Person> GetFriends(Person person, int count) 
    { 
     Person personAlias = null; 
     Person friendAlias = null; 

     ICriteria criteria = NHibernateSessionManager.Instance.GetSession() 
      .CreateCriteria(typeof (Person),() => personAlias) 
      .CreateCriteria(() => personAlias.Friends,() => friendAlias, JoinType.LeftOuterJoin) 
      .AddOrder(() => friendAlias.LatestLogin, Order.Desc) 
      .Add<Person>(p => p.ID == person.ID) 
      .SetMaxResults(count); 
     return criteria.List<Person>(); 
    } 

qui ne saisit tous les utilisateurs amis, mais ils ne sont pas commandés LatestLogin. Des idées?

+0

Je suggère d'utiliser SQL Profiler (si vous utilisez SQL Server) pour obtenir la requête générée et examiner ce qui est réellement généré et pourquoi il ne fonctionne pas en tant que requête SQL. Peut-être aussi partager cela avec nous ... La propriété Friends est-elle un many-to-many avec Person à travers une table d'association? – tolism7

Répondre

1

Je sais que cela peut sembler bizarre, mais la solution est de changer la ligne:

.AddOrder(() => friendAlias.LatestLogin, Order.Desc) 

avec:

.AddOrder(() => personAlias.LatestLogin, Order.Desc) 

Vous devez voir l'autre sens afin de comprendre pourquoi cette est nécessaire et pas évident au début.

Vous demandez des objets Personne (personAlias) qui ont le même ami 'Parent' (friendAlias) avec ID == person.ID (.Add (p => p.ID == personne.ID)) donc vous avez besoin pour trier par le personAlias.LatestLogin et PAS le friendAlias.LatestLogin.

+0

Merci cela a bien fonctionné! J'ai une question connexe disponible à http://stackoverflow.com/questions/1718857/nhibernate-lambda-extensions-eager-loading-a-collections-assosciations Que vous serez probablement en mesure de répondre si vous voulez un autre 15 points ! :) Merci beaucoup pour votre aide! – reach4thelasers

+0

Hey mec, des idées sur cette question NHibernateLambdaExtensions? http://stackoverflow.com/questions/1809247/nhlambdaextensions-create-a-criterion-object-to-add-to-icriteria-later – reach4thelasers

Questions connexes