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, но столкнулся с проблемой при попытке присоединиться к таблице несколько раз.