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; }
}
J'essaie de sélectionner les 5 premiers éléments de recherche en fonction de la somme de leur nombre dans le SearchTextLog. Actuellement, je n'ai pu résoudre ce problème qu'en effectuant une requête pour obtenir les 5 premiers éléments, puis en utilisant le résultat dans une seconde requête. Je me demandais si quelqu'un pouvait me montrer la lumière et m'apprendre comment je pouvais intégrer ces deux requêtes séparées dans une seule unité.NHibernate Les critères sélectionnent les éléments par le groupe et la somme de itemid dans une autre table
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 ma solution actuelle va perdre l'ordre important en des résultats. Donc, je vais certainement devoir incorporer les requêtes. : -/
Edit:
J'ai essayé une mise en correspondance bidirectionnelle trop pour permettre la déclaration suivante, cependant, je ne peux pas l'obtenir pour retourner les articles searchtext. Il se plaint simplement que les propriétés SearchText ne font pas partie d'un regroupement.
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 tout à fait nouveau pour moi, et nécessite une manière complètement différente de la pensée.
Vérifiez le code mis à jour, je pense que vous avez besoin à la fois GroupProperty (pour générer grouper par) ainsi que Projections.Property pour dire au moteur de requête de générer cette propriété dans la sélection – Jaguar