2009-12-07 39 views
1

我有一篇文章带有一组类别。 如何使用标准接口查询包含具有特定ID的所有类别的所有文章?NHibernate:如何检索“具有”标准中具有某个谓词的所有实体的实体

这不是一个“in”,我只需要那些有全部需要的类别 - 以及其他。部分比赛不应该进入。

目前我的代码与这个绝望的尝试失败:

var c = session.CreateCriteria<Article>("a"); 
if (categoryKeys.HasItems()) 
{ 
    c.CreateAlias("a.Categories", "c"); 
    foreach (var key in categoryKeys) 
     c.Add(Restrictions.Eq("c", key)); //bogus, I know! 
} 

回答

1

使用“IN”限制,但补充,以确保类别匹配的数量等于您正在寻找的所有类别的数量,以确保所有类别匹配,而不仅仅是一个子集。

举个例子,我想说的是,你可能想看看this page,尤其是“Toxi solution”标题下的“Intersection”查询。使用“类别”将“书签”替换为“文章”和“标签”以将其映射回您的特定问题。这里是他们展示那里的SQL:我相信你也可以用,可能是更容易的子查询与标准API

SELECT Article.Id 
FROM Article 
INNER JOIN (
     SELECT ArticleId, count(*) AS MatchingCategories 
     FROM ArticleCategoryMap 
     WHERE CategoryId IN (<list of category ids>) 
     GROUP BY ArticleId 
) subquery ON subquery.ArticleId = EntityTable.Id 
WHERE subquery.MatchingCategories = <number of category ids in list> 
+0

听起来很合理,我在nhuser列表上收到了同样的建议。我会看看我是否可以将其纳入标准 - 似乎并不复杂。 – Jan

+0

另请参阅:http://stackoverflow.com/questions/948978/nhibernate-query-for-matching-all-tags查询方法使用HQL。 – iammichael

0

我不是100%肯定,但我认为query by example可能是你想要的。

+0

也许这可以工作,但我更喜欢一些更明显的东西... – Jan

0

假设文章类别代表表示此

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列表变大。

我提供此解决方案不是推荐的方式,但至少您可以在寻找合适的解决方案时找到适合的解决方案。

相关问题