2010-03-20 2 views
2

두 엔터티가 PostTag입니다. Post 엔티티는 둘 사이의 다 대다 조인을 나타내는 태그 모음을 가지고 있습니다 (즉, 각 게시물은 여러 개의 태그를 가질 수 있으며 각 태그는 여러 개의 게시물과 연관 될 수 있습니다).NHibernate에서 many-to-many 연관을 통해 질의하는 방법은 무엇입니까?

주어진 태그가있는 모든 게시물을 검색하려고합니다. 그러나, 나는이 쿼리를 바로 얻을 수없는 것 같습니다.

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

도이 접근 내가 찾은 유일한 것은 a post by Ayende이다 : 나는 기본적으로 다음과 같은 의사 HQL과 같은 의미 무언가를 원한다. 그러나, 그의 접근법은 상대방 (나의 경우에는 Tag)의 엔티티가 many-to-many의 다른 끝을 보여주는 콜렉션을 가질 것을 요구한다. 나는 이것을 갖고 싶지 않고 정말로 가지고 싶다. 나는 이것이 할 수 없다고 믿는 것이 어렵다고 느낍니다. 내가 뭘 놓치고 있니?


내 기관 & 매핑 (간체) 같이 : 나는 답을 찾은 것 같은

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 

내가 생각했던 것보다 쉽습니다. :)

관련 문제