C # + Замок ActiveRecord: HasAndBelongsToMany и коллекции - PullRequest
3 голосов
/ 25 сентября 2008

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

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

Ответы [ 3 ]

2 голосов
/ 02 октября 2008

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

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

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

0 голосов
/ 06 ноября 2008

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

Я получил такое решение:

select p 
FROM Post p
JOIN p.Tags tag1
JOIN p.Tags tag2
WHERE
    tag1.Id = 1
    tag2.Id = 2

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

0 голосов
/ 25 сентября 2008

У меня сейчас нет системы с установкой 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();
...