假设文章类别代表表示此
SELECT b.*
FROM tagmap bt, bookmark b, tag t
WHERE bt.tag_id = t.tag_id
AND (t.name IN ('bookmark', 'webservice', 'semweb'))
AND b.id = bt.bookmark_id
GROUP BY b.id
HAVING COUNT(b.id)=3
是一个一对多的关系,该类别有许多对一个属性调用文章在这里是这样做的一个非常肮脏的方式(我真的不为此感到自豪,但它的工作原理)
List<long> catkeys = new List<long>() { 4, 5, 6, 7 };
if (catkeys.Count == 0)
return;
var cr = Session.CreateCriteria<Article>("article")
.CreateCriteria("Categories", "cat0")
.Add(Restrictions.Eq("cat0.Id", catkeys[0]));
if (catkeys.Count > 1)
{
for (int i = 1; i < catkeys.Count; i++)
{
cr = cr.CreateCriteria("Article", "a" + i)
.CreateCriteria("Categories", "cat" + i)
.Add(Restrictions.Eq("cat" + i + ".Id", catkeys[i]));
}
}
var results = cr.List<Article>();
它所确实是一遍又一遍地重新加入关系,保证你在类别ID之间的AND。它应该是非常慢的查询,尤其是如果Ids列表变大。
我提供此解决方案不是推荐的方式,但至少您可以在寻找合适的解决方案时找到适合的解决方案。
听起来很合理,我在nhuser列表上收到了同样的建议。我会看看我是否可以将其纳入标准 - 似乎并不复杂。 – Jan
另请参阅:http://stackoverflow.com/questions/948978/nhibernate-query-for-matching-all-tags查询方法使用HQL。 – iammichael