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

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

UPD

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

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

person Alexander Byndyu    schedule 30.05.2012    source источник


Ответы (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 представляет собой набор идентификаторов.

person hazzik    schedule 30.05.2012
comment
Этот запрос выдает [NullReferenceException: ссылка на объект не указывает на экземпляр объекта.] Но работает, если изменить на: Session.QueryOver‹Post›() .JoinAlias(p =› p.Tags, () =› tag) .WhereRestrictionOn (() => tag.Id) .IsIn(criterion.InterestedTags.Select(x => x.Id).ToArray()) .List‹Post›(); - person Alexander Byndyu; 30.05.2012
comment
Вам нужно выбрать точное поле для сравнения. В данном случае идентификатор. Итак, в методе IsIn нам нужен идентификатор. IsIn(criterion.InterestedTags.Select(x => x.Id)).ToList() - person maxspan; 05.03.2015