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());