LINQ, которая свободно NHibernate на.Contains() не работает в QueryOver, но работает в запросе

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

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

но я получаю ошибку в .Содержит() способ :

непризнанный вызов метода: Система.Сборники.Общий.ICollection ' 1 [[Система.Int64, mscorlib, Версия=4.0.0.0, культуры=нейтральный, PublicKeyToken=b77a5c561934e089]]: логическое содержит (Int64)

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

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

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

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

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

2 ответов


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

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

мне пришлось использовать WhereRestrictionOn ()


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

_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, это означает, что это должно быть немного легче проверить и теоретически поменять ORMs.