LINQ Fluent NHIBERNATE.Contains() не работает в QueryOver <>, но работает в Query <>

Используя FNH, я пытаюсь получить категории, используя следующее:

_session.QueryOver<Data.Model.Category>()
                                     .Where(c => tourCreateRequest.Categories.Contains(c.CategoryId))
                                     .List()
                                     .Select(_categoryMapper.CreateCategory)
                                     .ToList();

Но я получаю сообщение об ошибке в методе .Contains():

Непризнанный вызов метода: System.Collections.Generic.ICollection`1 [[System.Int64, mscorlib, Версия = 4.0.0.0, Культура = нейтральная, PublicKeyToken = b77a5c561934e089]]: Boolean Содержит (Int64)

Почему я получаю эту ошибку, что не так?

Я просмотрел некоторые сообщения, а затем изменил свой запрос на (ниже), и это работает с Query < > .

_session.Query<Data.Model.Category>()
                                     .Where(c => tourCreateRequest.Categories.Contains(c.CategoryId))
                                     .ToList()
                                     .Select(_categoryMapper.CreateCategory)
                                     .ToList();

Я думал, что QueryOver < > является последним и самым большим и должен использоваться вместо Query < > .

В чем проблема с тем, как я использую QueryOver < > , как показано выше?

Ответы

Ответ 1

Я нашел ответ. Благодаря сообщению: NHibernate с помощью QueryOver с WHERE IN

var categories = _session.QueryOver<Data.Model.Category>()
                                     .WhereRestrictionOn(c => c.CategoryId).IsIn(ArrayofCategoryIds)
                                     .List()
                                     .Select(_categoryMapper.CreateCategory)
                                     .ToList();

Мне пришлось использовать функцию WhereRestrictionOn()

Ответ 2

Это касательная проблема, и это казалось лучшим местом для ее размещения.

_session.Query<SomeType>.Where(t => someEnumerable.Contains(t))

не работал.

В моем случае someEnumerable не был List<SomeType>, а скорее HashSet<SomeType>. По-видимому, NH действительно хочет, чтобы это был список. Итак, я сделал это, и это сработало.

var someEnumerableList = someEnumerable.ToList();
_session.Query<SomeType>.Where(t => someEnumerableList.Contains(t)

Кроме того, FWIW у меня создалось впечатление, что Query<T> был новым предпочтительным способом, и что QueryOver<T> был менее предпочтительным способом, потому что Query<T> возвращает IQueryable, что означает, что это должно быть немного проще тестировать и теоретически менять ORM.

Ответ 3

как это:

    query = query.WhereRestrictionOn(x => x.DescricaoDoProduto.Homogenize()).IsInsensitiveLike
(filter.Description.Homogenize());