Solución:
Debe codificar la traducción o primero debe convertirla a IEnumerable
. IQueryable
representa el árbol de expresión traducido a alguna ejecución en el proveedor usado; en su caso, creo que será Entity framework. No puede usar ningún mapeo automático en dicha consulta porque se traducirá a SQL, que no comprenderá sus métodos .net o AutoMapper. Las proyecciones a tipos personalizados son parte de la consulta y deben estar codificadas. Puede crear un método de extensión personalizado para IQueryable
y reutilícelo donde lo necesite:
public static IQueryabe<SimpleUser> ProjectToSimpleUser(this IQueryable<User> query)
{
return query.Select(u => new SimpleUser
{
// Here map your fields
});
}
Ahora puedes usar:
return repo.GetUsers().ProjectToSimpleUser();
En caso de Entity framework SimpleUser
no debe ser una entidad mapeada.
Siempre que SimpleUser se pueda asignar al usuario (el usuario es una interfaz de la clase base de SimpleUser), puede
var users = simpleUsers.Cast<User>();
opcionalmente con
var users = simpleUsers.Cast<User>().AsQueryable();
Y si no está seguro de si todos los elementos son realmente Usuarios, puede usar OfType<User>
en lugar de Cast<User>
AutoMapper es la herramienta que desea; funciona a través de la reflexión y, a menos que le indique lo contrario, mapeará las propiedades con el mismo nombre directamente.
El mapeo automático es la técnica.