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
это коллекция идентификаторов.