Estoy buscando incorporar traducciones de valor de propiedad en mis consultas de QueryOver.Cómo incorporar la conversión de valor de propiedad en NHibernate QueryOver .SelectList?
Me gusta escribir consultas siguiendo el patrón de objeto de consulta, produciendo directamente modelos de vista MVC. En mi opinión, los modelos, trato de usar tipos de propiedades que sean lo más simples posible, manteniendo la complejidad de conversión fuera de las vistas y los controladores. Esto significa que, a veces, tendré que convertir un tipo en otro, como las fechas en cadenas.
Se podría argumentar que tales conversiones deberían realizarse en las vistas, pero como la mayoría de mis modelos de vista se traducen directamente a objetos JSON, la conversión sería mucho más engorrosa. Realizar la conversión de fecha a cadena en JavaScript es problemático en el mejor de los casos y mi convertidor JSON no es lo suficientemente flexible.
He aquí un ejemplo de lo que estoy haciendo:
// Entity.
public class Customer
{
public int Id { get; set; }
public string Name { get; set; }
public DateTimeOffset DateCreated { get; set; }
}
// View model.
public class CustomerViewModel
{
public string Name { get; set; }
public string DateCreated { get; set; } // Note the string type here.
}
// Query.
CustomerViewModel model = null;
List<CustomerViewModel> result = Session.QueryOver<Customer>()
.SelectList(list => list
.Select(n => n.Name).WithAlias(() => model.Name)
.Select(n => n.DateCreated).WithAlias(() => model.DateCreated))
.TransformUsing(Transformers.AliasToBean<CustomerViewModel>());
.Future<CustomerViewModel>()
.ToList();
Cuando se ejecuta el código de consulta, la excepción siguiente:
Object of type 'System.DateTimeOffset' cannot be converted to type 'System.String'.
Obviamente, esto es debido a la siguiente línea:
.Select(n => n.DateCreated).WithAlias(() => model.DateCreated))
Así que la pregunta es: ¿cómo para incorporar la fecha a la conversión de cadena en la consulta?
No deseo realizar la conversión después de que se haya ejecutado la consulta porque necesitaría una clase intermedia adicional para almacenar los resultados antes de convertirlos.
Gracias. En cuanto al alias, es superfluo, así que lo eliminé de la pregunta. La conversión de cadenas en su primer ejemplo de hecho no deja ningún control sobre el formato de cadena, mientras que realmente lo necesito.Voy a investigar su segunda sugerencia, podría ayudarme aunque prefiera hacer la conversión en el objeto de consulta en lugar de la clase de modelo de vista. –
Buena suerte, probé un montón de cosas, pero esto es lo mejor que se me ocurrió. Otras posibilidades son crear un transformador personalizado o usar Automapper. –
Terriblemente feo, pero AFAIK sigue siendo la única solución que funciona. Es extraño que QueryOver tenga tantos problemas con 'ToString()', teniendo en cuenta que se traduce exactamente en lo mismo ... – Aaronaught