有没有办法用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。