如何在NHibernate中查询多对多关联?

时间:2010-03-20 23:33:31

标签: c# nhibernate fluent-nhibernate hql

我有两个实体PostTagPost实体有一组标签,表示两者之间的多对多连接(即每个帖子可以有任意数量的标签,每个标签可以与任意数量的帖子相关联)。 / p>

我正在尝试检索具有给定标记的所有帖子。但是,我似乎无法正确查询此查询。我基本上想要一些与下面的伪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();
    }
}

1 个答案:

答案 0 :(得分:0)

看起来我找到了答案。不太清楚为什么我昨天没有想到,但你可以转过身来使用in

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

比我想象的要容易。 :)