icriterion - LINQ Fluent NHIBERNATE.Contains() no funciona en QueryOver<> pero funciona en Query<>
criteria c# (2)
Usando FNH, estoy tratando de recuperar categorías, usando lo siguiente:
_session.QueryOver<Data.Model.Category>()
.Where(c => tourCreateRequest.Categories.Contains(c.CategoryId))
.List()
.Select(_categoryMapper.CreateCategory)
.ToList();
Pero me sale un error en el método .Contains () :
Llamada de método no reconocido: System.Collections.Generic.ICollection`1 [[System.Int64, mscorlib, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b77a5c561934e089]]: Boolean Contiene (Int64)
¿Por qué estoy recibiendo ese error, ¿qué está mal?
Revisé algunas publicaciones y luego cambié mi consulta a (a continuación), y esto funciona con la consulta <>.
_session.Query<Data.Model.Category>()
.Where(c => tourCreateRequest.Categories.Contains(c.CategoryId))
.ToList()
.Select(_categoryMapper.CreateCategory)
.ToList();
Pensé que QueryOver <> es la última y la mejor, y debería usarse en lugar de Query <>.
¿Cuál es el problema con la forma en que uso QueryOver <> como se muestra arriba?
Encontré la respuesta. Gracias a la publicación en: NHibernate usando QueryOver con WHERE IN
var categories = _session.QueryOver<Data.Model.Category>()
.WhereRestrictionOn(c => c.CategoryId).IsIn(ArrayofCategoryIds)
.List()
.Select(_categoryMapper.CreateCategory)
.ToList();
Tuve que usar el WhereRestrictionOn ()
Este es un tema relacionado tangencialmente y este parece ser el mejor lugar para ponerlo.
_session.Query<SomeType>.Where(t => someEnumerable.Contains(t))
no estaba funcionando.
En mi caso, someEnumerable
NO eran una List<SomeType>
, sino un HashSet<SomeType>
. Al parecer, NH realmente quiere que sea una lista. Entonces, hice esto en su lugar y funcionó.
var someEnumerableList = someEnumerable.ToList();
_session.Query<SomeType>.Where(t => someEnumerableList.Contains(t)
También, FWIW, tenía la impresión de que Query<T>
era la nueva forma preferida de ir y QueryOver<T>
era la menos preferida, porque Query<T>
devuelve IQueryable, lo que significa que debería ser un poco más fácil prueba, y teóricamente intercambiar ORMs.