NHibernate QueryOver и фильтрация коллекций

Простой пример моего класса:

public class Post
{
    public IEnumerable<Tag> Tags { get; set; }
}

Пользователь проверяет несколько интересных тегов для фильтрации списка сообщений.

Мне нужно отфильтровать все сообщения по выбранным тегам, как:

Session.QueryOver<Post>()
    .WhereRestrictionOn(x => x.Tags)
    .IsIn(criterion.InterestedTags.ToList())
    .List<Post>();

Исключение: NHibernate.QueryException: Cannot use collections with InExpression

На самом деле, я должен показать сообщение, если один из его тегов содержится в InterestedTags.

UPD

Работает для меня:

Session.QueryOver<Post>()
    .JoinAlias(p => p.Tags, () => tag)
    .WhereRestrictionOn(() => tag.Id)
    .IsIn(criterion.InterestedTags.Select(x => x.Id).ToArray())
    .List<Post>();

1 ответ

Решение

Вы должны использовать псевдоним, чтобы наложить ограничения на one-to-many часть

Попробуйте следующий фрагмент кода:

Tag tag = null; 
Session.QueryOver<Post>()
    .JoinAlias(p => p.Tags, () => tag)
    .WhereRestrictionOn(() => tag.Id)
    .IsIn(criterion.InterestedTags.ToList()) //*
    .List<Post>();

*При условии, что InterestedTags это коллекция идентификаторов.

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