2012-05-30 2 views
2

Простой пример моего класса: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>(); 

ответ

5

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

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

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

* Предполагая, что InterestedTags - это набор идентификаторов.

+0

Этот запрос бросает [NullReferenceException:. Ссылка на объект не указывает на экземпляр объекта] Но работает, если изменение: Session.QueryOver () .JoinAlias ​​(р => p.Tags,() => tag) .WhereRestrictionOn (() => tag.Id) .IsIn (критерий.InterestedTags.Select (x => x.Id) .ToArray()) .List (); –

+0

Вам нужно выбрать точное поле для сравнения. В этом случае идентификатор. Поэтому в методе IsIn нам нужен Id. IsIn (критерий .InterestedTags.Select (x => x.Id)). ToList() – maxspan

Смежные вопросы