使用NHibernate ICriteria或QueryOver按聚合子查询排序

时间:2011-01-21 12:49:30

标签: nhibernate subquery aggregate icriteria queryover

有没有办法用NHibernate ICriteria或QueryOver实现这样的SQL?

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

但是,生成的查询不会加入fetch BlogPost。相反,它只返回ids,当迭代BlogPost时,它会导致选择n + 1。

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

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

This looks like a similar issue.

现在可以使用NHibernate 3吗?

如果没有,是否有替代解决方案?

我可以改变架构&amp;域模型,如有必要。如果可能,我不想使用SQL或HQL。

1 个答案:

答案 0 :(得分:0)

我知道这个问题是在不久前发布的,但我想做同样的事情,请看看我的问题here,这个人here,也许你可以使用理念。