C# + Замок ActiveRecord: HasAndBelongsToMany и коллекции

Допустим, у меня есть отношение многие ко многим (с использованием атрибута ActiveRecord HasAndBelongsToMany) между сообщениями и тегами (имена объектов домена изменены, чтобы защитить невинных), и я хотел такой метод, как

 FindAllPostByTags(теги IList ) 
который возвращает все сообщения, которые имеют все (а не только некоторые) теги в параметре. В любом случае я мог бы сделать это либо с помощью выражений NHibernate или HQL? Я искал документацию по HQL и не смог найти ничего, что соответствовало бы моим потребностям. Я надеюсь, что я просто упускаю что-то очевидное!

3 ответа

Решение

Вы также можете просто использовать IN заявление

DetachedCriteria query = DetachedCriteria.For<Post>();
query.CreateCriteria("Post").Add(Expression.In("TagName",  string.Join(",",tags.ToArray()) );

Я не скомпилировал это, чтобы он мог иметь ошибки

У меня сейчас нет системы с установкой Castle, поэтому я не тестировал и не компилировал ее, но приведенный ниже код должен делать то, что вы хотите.

Junction c = Expression.Conjunction();
foreach(Tag t in tags)
    c = c.Add( Expression.Eq("Tag", t);

return sess.CreateCriteria(typeof(Post)).Add(c).List();

У меня была та же проблема, и я попытался прочитать HQL-документацию, однако некоторые функции, кажется, не реализованы в NHibernate (например, с ключевым словом)

Я закончил с таким решением:

выбрать p ОТ сообщения p ПРИСОЕДИНИТЬСЯ p.Tags tag1 ПРИСОЕДИНИТЬСЯ p.Tags tag2 ГДЕ tag1.Id = 1 tag2.Id = 2

Это означает, что динамически собирайте HQL, используя join для каждого тега, затем сделайте выбор в предложении WHERE. Это сработало для меня. Я попытался сделать то же самое с DetachedCriteria, но столкнулся с проблемой при попытке присоединиться к таблице несколько раз.

Другие вопросы по тегам