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 のみを返すため、BlogPost
s が繰り返されるときに 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は使いたくない。