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.
OriginalL'auteur ctrlplusb | 2010-07-20
Vous devez vous connecter pour publier un commentaire.
Ok, je pense avoir trouvé une solution.
Ma solution originale que par ma question ne fonctionnera pas parce que NHibernate ne supporte pas encore la possibilité de faire un groupe par la propriété sans l'ajouter à la clause select (voir: texte du lien).
Tout en dupant autour, cependant, je suis tombé sur ces choses cool appelé ResultTransformers. À l'aide de la AliasToBean résultat transformateur Nhibernate automatiquement l'alias de l'-je donner à chaque projection de l'élément aux propriétés du même nom au sein d'un type que je préciser. J'ai simplement précisé que mon Texterecherché objet (cependant, j'ai dû ajouter un TotalSearchCount propriété pour la somme de projection de l'élément). Il peuplée mes objets parfaitement et sont retournés.
Je suis surpris de découvrir que ce n'était pas facile de le faire. Cela m'a pris environ 4 à 5 heures de recherche et de développement de celui-ci. J'espère que mon NHibernate expérience sera plus facile avec de plus en plus d'expérience.
J'espère que cela aide quelqu'un d'autre!
Merci beaucoup, m'a aidé aussi!
OriginalL'auteur ctrlplusb
ne fait pas ce travail?
Ce doit travail si vous appelez
List<Object[]>()
. Vous n'obtenez pas une liste d'objets de type, mais si vous pouvez traiter avec unIList<Object[]>
vous n'aurez pas à créer une valeur titulaire de classe pour vos résultats. Il n'est probablement pas aussi propre que la solution retenue.OriginalL'auteur Jaguar