2010-03-20 52 views
2

我有兩個實體,PostTagPost實體具有代表這兩者之間的多對多連接的標籤集合(也就是說,每個職位可以具有任意數量的標籤,並且每個標籤可以與任意數量的職位關聯)。如何查詢NHibernate中的多對多關聯?

我想檢索所有有給定標籤的帖子。但是,我似乎無法獲得正確的查詢。我基本上想要的東西,這意味着同爲以下僞HQL:

from Posts p 
where p.Tags contains (from Tags t where t.Name = :tagName) 
order by p.DateTime 

我發現的唯一的事情甚至接近這個a post by Ayende。然而,他的方法要求另一方的實體(在我的案例中爲Tag)有一個集合,顯示多對多的另一端。我沒有這個,也不是真的希望擁有它。我很難相信這是不可能完成的。我錯過了什麼?


我的實體&映射像這樣(簡化):

public class Post { 
    public virtual int Id { get; set; } 
    public virtual string Title { get; set; } 
    private IList<Tag> tags = new List<Tag>(); 

    public virtual IEnumerable<Tag> Tags { 
     get { return tags; } 
    } 

    public virtual void AddTag(Tag tag) { 
     this.tags.Add(tag); 
    } 
} 

public class PostMap : ClassMap<Post> { 
    public PostMap() { 
     Id(x => x.Id).GeneratedBy.HiLo("99"); 
     Map(x => x.Title); 
     HasManyToMany(x => x.Tags); 
    } 
} 

// ---- 

public class Tag { 
    public virtual int Id { get; set; } 
    public virtual string Name { get; set; } 
} 

public class TagMap : ClassMap<Tag> { 
    public TagMap() { 
     Id(x => x.Id).GeneratedBy.HiLo("99"); 
     Map(x => x.Name).Unique(); 
    } 
} 

回答

0

看起來像我已經找到了答案。不太清楚爲什麼我沒有想到昨天,但你可以轉過來,並使用in

from Post p 
where (
    select t 
    from Tag t 
    where t.Name = :tagName 
) in elements(p.Tags) 
order by p.DateTime 

比我想象的要容易。 :)