tengo IQueryable cuyo marco 4 objetos Entidad quisiera proyectar a sus equivalentes de DTO. Uno de esos objetos 'Persona' es una clase EF4, y el POCO PersonP correspondiente es una clase que he definido. Estoy usando Automapper para mapear entre ellos. Sin embargo, cuando intento el siguiente código:IQueryable Lambda proyección Sintaxis
IQueryable<Person> originalModel = _repo.QueryAll();
IQueryable<PersonP> projection = originalModel.Select(e => Mapper.Map<Person, PersonP>(e));
La proyección genera este error en tiempo de ejecución:
LINQ to Entities does not recognize the method 'TestSite.Models.PersonP Map[Person,PersonP](TestSite.DataLayer.Model.Person)' method, and this method cannot be translated into a store expression.
¿Cuál es la sintaxis adecuada para crear una proyección IQueryable<PersonP>
usando AutoMapper? Gracias.
P.S. AutoMapper está configurado correctamente - lo uso en otros lugares para convertir de ida y vuelta entre la persona y PersonP, es decir Mapper.Map<Person, PersonP>(myPersonObject)
correctamente devuelve un objeto PersonP
.
EDITAR (más código):
estoy usando esto para una función auxiliar para unir EF4 Entidad POCOs (PersonP) a una red de Telerik - que no serializar las propias entidades adecuadamente ya que contienen circular referencias (es decir, propiedades de navegación). Mi código es el siguiente:
public static GridModel GetGridModel<TEntity, TPoco>(IRepository<TEntity> repo, GridState gridState) where TEntity : EntityObject
{
var originalModel = repo.QueryAll().ToGridModel(gridState);
var projection = originalModel.Select(e => Mapper.Map<TEntity, TPoco>(e));
return projection.ToGridModel(gridState); // applies filters, sorts, pages, etc...
}
el método .ToGridModel
es un método de extensión en IQueryable
y devuelve un objeto complejo que no puedo analizar con fiabilidad - por lo que este me lleva a creer que tenga que realizar el filtrado después de haber hecho la proyección a POCOs.
ACTUALIZACIÓN 2:
Tratando de simplificar las cosas, me hizo un método no genérico como esto:
public static GridModel GetGridModel2(IRepository<Client> repo, GridState gridState)
{
IQueryable<Client> originalModel = repo.QueryAll();
IQueryable<ClientP> projection = originalModel.Select(c => ClientToClientP(c));
return projection.ToGridModel(gridState);
}
private static ClientP ClientToClientP(Client c)
{
return new ClientP { Id = c.Id, FirstName = c.FirstName };
}
Este código también falla al crear la proyección. Noto que IQueryable.Select() tiene múltiples sobrecargas: Expression> es uno de ellos. ¿Podría representar esta función/delegar llamada usando una de estas sobrecargas?
Esto falla incluso con un método regular en lugar de AutoMapper. Por favor, mire UPDATED2 en mi publicación. – Harper
Ver la actualización. Las no expresiones no se pueden traducir a SQL. –
Gracias por su ayuda. Su código funciona (error tipográfico corregido en el método sig) pero como mencionó, AutoMapper no es adecuado para este propósito y no funciona. ¿Podría explicar la razón técnica por la que no puedo sustituir el nuevo ClientP {Id = ..} por un mapeo de AutoMapper, ya que ambos devuelven un objeto ClientP? – Harper