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 BlogPosts 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.

Était-ce utile?

La solution

Je sais que cette question a été posée il y a quelque temps, mais je veux faire la même chose, s'il vous plaît jeter un oeil à ma question ici , et ce type ici , vous pouvez peut-être utiliser l'idée.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top