Как сделать запрос через много-ко-многим в NHibernate? - PullRequest
2 голосов
/ 21 марта 2010

У меня есть две сущности, Post и Tag. Сущность Post имеет коллекцию тегов, которая представляет соединение «многие ко многим» между двумя (т. Е. Каждое сообщение может иметь любое количество тегов, и каждый тег может быть связан с любым количеством сообщений).

Я пытаюсь получить все сообщения, имеющие данный тег. Тем не менее, я, кажется, не могу правильно понять этот запрос. По сути, я хочу что-то, что означает то же, что и следующий псевдо-HQL:

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

Единственное, что я нашел, что даже подходит к этому - это пост Айенде . Однако его подход требует, чтобы у сущности на другой стороне (в моем случае, 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 голосов
/ 21 марта 2010

Похоже, я нашел ответ. Не совсем уверен, почему я не подумал вчера, но вы можете просто перевернуть его и использовать in.

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

Проще, чем я думал. :)

...