Есть ли способ достичь SQL подобным образом с помощью NHibernate ICriteria или 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
Цель состоит в том, чтобы ранжировать посты в блоге по количеству совпадающих тегов, чтобы пост с тегом Тег X и Y стоит над сообщениями с тегом X .
У меня пока есть это:
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()));
Однако полученный запрос не присоединяется к выборке BlogPost
.Вместо этого он возвращает только идентификаторы, что приводит к выбору n + 1 при итерации BlogPost
.
public class BlogPost
{
...
ISet<Tag> Tags {get; set;}
}
public class Tag
{
BlogPost BlogPost { get; set; }
string Name { get; set; }
}
Это похоже на похожую проблему.
Возможно ли это теперь с NHibernate 3?
Если нет, есть ли альтернативное решение?
Я могу изменить схему и модель домена, еслинеобходимо.Я не хочу использовать SQL или HQL, если это возможно.