Actualmente tengo el siguiente código:¿Es posible refactorizar esta consulta de nHibernate Linq?
switch (publicationType)
{
case PublicationType.Book:
return Session.Query<Publication>()
.Where(p => p.PublicationType == PublicationType.Book)
.OrderByDescending(p => p.DateApproved)
.Take(10)
.Select(p => new PublicationViewModel
{
...
});
case PublicationType.Magazine:
return Session.Query<Publication>()
.Where(p => p.PublicationType == PublicationType.Magazine)
.OrderByDescending(p => p.DateApproved)
.Take(10)
.Select(p => new PublicationViewModel
{
...
});
case PublicationType.Newspaper
....
}
Como se puede ver la consulta es el mismo cada vez con excepción de la condición publicationType. Traté de refactorizar esto creando un método que tenga una Func, p.
private IEnumerable<PublicationViewModel> GetPublicationItems(Func<PublicationType, bool>> pubQuery)
{
return Session.Query<Publication>()
.Where(pubQuery)
.OrderByDescending(p => p.DateApproved)
.Take(10)
.Select(p => new PublicationViewModel
{
...
});
}
private bool IsBook(PublicationType publicationType)
{
return publicationType == PublicationType.Book;
}
y luego llamar a este método como
GetPublicationItems(IsBook);
Pero cuando hago esto me sale el error: InvalidCastException: No se puede convertir objeto de tipo 'NHibernate.Hql.Ast.HqlParameter' para escribir 'NHibernate.Hql.Ast.HqlBooleanExpression'.
¿Hay alguna otra manera de hacerlo?
impresionante gracias. Hice mi ejemplo un poco demasiado simple y como usted señaló, podría pasar el tipo de publicación directamente a la consulta. Pero la generalización que publicaste después de eso era exactamente lo que buscaba. – Zac