2011-01-21 57 views
2

有没有一种方法来实现与NHibernate ICriteria或QueryOver这样的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标签ÿ自带以上只是标记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。相反,它仅返回ID,当迭代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这是现在可能吗?

如果没有,是否有其他解决方案?

如有必要,我可以更改模式&域模型。如果可能,我不想使用SQL或HQL。

回答

0

我知道这个问题是前段时间提出的,但我想要做同样的事情,请看看我的问题here,和这个家伙here,也许你可以使用这个想法。

+0

我的问题已通过更改数据库模式解决,但您链接的答案看起来像他们将解决我的问题。 – mattk 2012-06-07 11:42:25