NHibernate Critères, sélectionner des éléments par le groupe et par la somme de itemid dans une autre table

public class SearchText
{
    public virtual int Id { get; set; }
    public virtual string Text { get; set; }
}

public class SearchTextLog
{
    public virtual int Id { get; set; }
    public virtual SearchText SearchText { get; set; }
    public virtual User User { get; set; }
    public virtual int SearchCount { get; set; }
    public virtual DateTime LastSearchDate { get; set; }
}

Je suis en train de sélectionner le top 5 Texterecherché éléments basés sur la somme de leur nombre au sein de la SearchTextLog. Actuellement, j'ai seulement été en mesure de résoudre ce problème en effectuant d'abord une requête pour obtenir le top 5 des articles, puis en utilisant le résultat dans une deuxième requête. Je me demandais si quelqu'un pouvait me montrer la lumière et de m'apprendre comment je pourrais intégrer ces deux séparés des requêtes en une seule unité.

Voici ce que j'ai actuellement:

var topSearchCriteria = Session.CreateCriteria(typeof (SearchTextLog))
            .SetProjection(Projections.ProjectionList()
                            .Add(Projections.GroupProperty("SearchText.Id"))
                            .Add(Projections.Alias(Projections.Sum("SearchCount"), "SearchCount")))
            .AddOrder(Order.Desc("SearchCount"))
            .SetMaxResults(topSearchLimit)
            .List<int>();

return Session.CreateCriteria<SearchText>()
            .Add(Restrictions.In("Id", topSearchCriteria.ToArray()))
            .List<SearchText>();

Edit:

Oh non, je viens de réaliser que ma solution actuelle va perdre de la commande par les résultats. Donc, je vais certainement avoir à intégrer les requêtes. :-/

Edit:

J'ai essayé une mise en correspondance bidirectionnelle trop pour permettre l'instruction suivante, cependant, je ne peux pas le faire revenir Texterecherché éléments. Simplement, il se plaint de ce que la Texterecherché propriétés ne sont pas dans un groupement.

return Session.CreateCriteria<SearchText>()
                .CreateAlias("SearchTextLogs", "stl")
                .AddOrder(Order.Desc(Projections.Sum("stl.SearchCount")))
                .SetMaxResults(topSearchLimit)        
                .SetResultTransformer(Transformers.AliasToEntityMap)
                .List<SearchText>();

Excuse mon ignorance, mais Nhibernate est complètement nouveau pour moi, et nécessite un mode de pensée complètement différent.

vérifier la mise à jour du code, je pense que vous avez besoin de GroupProperty (pour générer du groupe par) wellas Projections.Propriété à dire le moteur de requête pour générer cette propriété dans la sélection

OriginalL'auteur ctrlplusb | 2010-07-20