icriterion nhibernate fluent-nhibernate linq-to-nhibernate

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.