Domanda

C'è un modo per ottenere SQL come questo con NHibernate ICriteria o 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

L'obiettivo è quello messaggi rango del blog per il numero di tag corrispondenti in modo che un post sia con tag X e tag Y viene sopra Post con tag solo X .

Ho questo finora:

 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()));

Tuttavia, la query risultante non unirsi a prendere BlogPost. Invece restituisce solo gli ID, che porta a selezionare n + 1 quando i BlogPosts sono iterate.

public class BlogPost
{
  ...
  ISet<Tag> Tags {get; set;}
}

public class Tag
{
  BlogPost BlogPost { get; set; }
  string Name { get; set; }
}

questo sembra un problema simile.

Questo è ora possibile con NHibernate 3?

In caso contrario, c'è una soluzione alternativa?

posso cambiare schema e modello di dominio, se necessario. Non voglio utilizzare SQL o HQL, se possibile.

È stato utile?

Soluzione

So che questa domanda è stato messo un po 'di tempo fa, ma io voglio fare la stessa cosa, si prega di dare un'occhiata alla mia domanda qui , e questo ragazzo qui , forse è possibile utilizzare l'idea.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top