2009-06-04 20 views
1

這裏是我的相關類:NHibernate的查詢匹配的所有標籤

public class Item { 
    public virtual int Id { get; protected set; } 
    public virtual IList<Tag> Tags { get; set; } 
} 

public class Tags { 
    public virtual int Id { get; protected set; } 
    public virtual string Name { get; set; } 
    public virtual IList<Item> Items { get; set; } 
} 

這些映射了多對多關聯。中間表名爲ItemsToTags。

這裏的問題:

給出一個字符串列表,我該如何創建一個NHibernate的查詢,返回所有Item S作所有的Tag s的Name小號匹配在給定列表中的所有字符串?

這是函數簽名:

IList<Item> GetItemsWithTags(IList<string> tagNames); 

我需要的東西,如:提前

from Item item 
where !tagsNames.Except(
    from item.Tags select item.Tags.Name 
).Any() 
select item 

感謝您的幫助。

+0

對不起,我誤解了你的問題,並沒有意識到你需要*全部*標籤來匹配。我知道如何用直接的SQL來做到這一點,但我不得不考慮如何使用NHibernate做到這一點......我在此期間刪除了我的不正確答案。 – 2009-06-04 21:09:34

回答

2

你肯定可以用HQL做到這一點;我已經成功測試了它。

var items = session.CreateQuery("SELECT i.Id FROM Item i JOIN i.Tags tags WHERE tags.Name IN(:tags) GROUP BY i HAVING COUNT(DISTINCT tags) = :tagCount") 
     .SetParameterList("tags", tagNames) 
     .SetInt32("tagCount", tagNames.Count) 
     .List(); 

,將讓你的Item標識,你可以用它來獲得Item的List。 GROUP BYHAVING組合可能雖然在某些DBMS上效率低下。還有另一種使用迭代連接的查詢方法,可能對某些DBMS更有效,但我無法使其工作(根本無法使用Criteria)。如果我曾經這樣做,我會更新我的答案。

+0

這工作,謝謝。爲了將來的參考,哪些系統可能效率低下? – kuhlmancer 2009-06-10 23:29:41

相關問題