Trier par Aggregate avec des sous-requêtes NHibernate ou ICriteria QueryOver
-
16-10-2019 - |
Question
Y at-il un moyen d'atteindre SQL comme celui-ci avec NHibernate ICriteria ou QueryOver?
select *
from [BlogPost] b
inner join (select blogpost_id, count(*) matchCount
from [Tag]
where name in ('tag X', 'tag Y')
group by blogpost_id
) tagmatch
on tagmatch.blogpost_id = b.Id
order by tagmatch.matchCount desc
Le but est de messages de blog de rang par le nombre de balises correspondant, et qu'un poste avec les deux balise X et tag Y vient au-dessus des postes avec seulement tag X .
J'ai ce à ce jour:
DetachedCriteria
.For<Tag>("tag")
.Add(Restrictions.In(Projections.Property<Tag>(x => x.Name), tags.ToArray()))
.SetProjection(Projections.Group<Tag>(t => t.BlogPost))
.CreateCriteria("BlogPost")
.SetFetchMode("BlogPost", FetchMode.Eager)
.AddOrder(Order.Desc(Projections.RowCount()));
Toutefois, la requête résultante ne se connecte pas chercher BlogPost
. Au contraire, il retourne seulement les ids, ce qui conduit à sélectionner n + 1 lorsque les BlogPost
s sont réitérés.
public class BlogPost
{
...
ISet<Tag> Tags {get; set;}
}
public class Tag
{
BlogPost BlogPost { get; set; }
string Name { get; set; }
}
Cela ressemble à un problème similaire.
Est-ce maintenant possible avec NHibernate 3?
Si non, est-il une solution de rechange?
Je peux modifier le schéma et modèle de domaine si nécessaire. Je ne veux pas utiliser SQL ou HQL si possible.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow