我有两个实体,PostTagPost实体具有一个Tag集合,该集合表示两者之间的多对多联接(即,每个帖子可以具有任意数量的标签,并且每个标签可以与任意数量的帖子相关联)。

我正在尝试检索所有具有给定标签的帖子。但是,我似乎无法正确获得此查询。我本质上想要的东西与以下伪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();
    }
}

最佳答案

看起来我找到了答案。不太确定为什么我没想到昨天,但是您可以将其转过来并使用in

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


比我想象的要容易。 :)

关于c# - 如何在NHibernate中查询多对多关联?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2485206/

10-13 22:26