Заказ по совокупному подзапросу с помощью NHibernate ICriteria или QueryOver - PullRequest
2 голосов
/ 21 января 2011

Есть ли способ достичь 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, если это возможно.

1 Ответ

0 голосов
/ 23 августа 2011

Я знаю, что этот вопрос был задан некоторое время назад, но я хочу сделать то же самое, пожалуйста, посмотрите на мой вопрос здесь , и этот парень здесь , возможно Вы можете использовать идею.

...