2

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。代わりに、id のみを返すため、BlogPosts が繰り返されるときに n+1 が選択されます。

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

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

これは同様の問題のように見えます。

これはNHibernate 3で可能になりましたか?

そうでない場合、代替ソリューションはありますか?

必要に応じてスキーマとドメイン モデルを変更できます。できればSQLやHQLは使いたくない。

4

1 に答える 1

0

私はこの質問が少し前に出されたことを知っていますが、私は同じことをしたいと思っています。ここで私の質問をください。

于 2011-08-22T22:54:08.840 に答える