Je vais avoir un cas du lundi ...Utilisation de NHibernate pour sélectionner des entités en fonction de l'activité des entités enfants
je dois sélectionner les messages de blog basé sur l'activité récente dans la collection des commentaires du poste (un message a List<Comment>
propriété et de même, un commentaire a une propriété de publication, établissant la relation.Je ne veux pas montrer le même poste deux fois, et j'ai seulement besoin d'un sous-ensemble des entités, pas tous les postes
était de saisir tous les messages qui ont des commentaires, puis les commander sur la base du commentaire le plus récent.Pour que cela fonctionne, je suis sûr que je devrais limiter les commentaires pour chaque poste au premier/plus récent commentaire. d simplement prendre e top 5 (ou quel que soit le nombre maximum de résultats que je veux passer dans la méthode).
Seconde pensée serait de saisir tous les commentaires, commandés par CreatedOn, et filtre donc il n'y a qu'un seul commentaire par message. Ensuite, retournez les messages les plus importants. Cela semble être la même chose que la première option, juste en passant par la porte arrière. J'ai une option de requête moche, deux j'ai travaillé avec un peu de LINQ sur le côté pour le filtrage, mais je sais qu'il y a une façon plus élégante de le faire en utilisant l'API NHibernate. En espérant voir de bonnes idées ici.
EDIT: Voici ce qui fonctionne pour moi jusqu'à présent. Bien que cela fonctionne, je suis sûr qu'il ya une meilleure façon de le faire ...
// get all comments ordered by CreatedOn date
var comments = Session.CreateCriteria(typeof(Comment)).AddOrder(new Order("CreatedOn", false)).List<Comment>();
var postIDs = (from c in comments select c.ParentPost.ID).Distinct();
// filter the comments
List<Post> posts = new List<Post>();
foreach(var postID in postIDs)
{
var post = Get(postID); // get a Post by ID
if(!posts.Contains(post)) // this "if" is redundant due to the Distinct filter on the PostIDs collection
{
posts.Add(post);
}
}
return posts;
Ajouté le plus à ma réponse –