2009-12-07 37 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列表變大。

我提供此解決方案不是推薦的方式,但至少您可以在尋找合適的解決方案時找到適合的解決方案。

相關問題