Puede proyectar en tipo anónimo, y luego de él a tipo de modelo
public IEnumerable<Product> GetProducts(int categoryID)
{
return (from p in Context.Set<Product>()
where p.CategoryID == categoryID
select new { Name = p.Name }).ToList()
.Select(x => new Product { Name = x.Name });
}
Editar : Voy a ser un poco más específico ya que esta pregunta llamó mucho la atención.
No puede proyectar directamente en el tipo de modelo (restricción de EF), por lo que no hay forma de evitarlo. La única forma es proyectar en tipo anónimo (primera iteración), y luego modelar el tipo (segunda iteración).
Tenga en cuenta también que cuando carga entidades parcialmente de esta manera, no se pueden actualizar, por lo que deben permanecer separadas, tal como están.
Nunca entendí completamente por qué esto no es posible, y las respuestas en este hilo no dan fuertes razones en su contra (principalmente hablando de datos parcialmente cargados). Es correcto que en el estado de carga parcial la entidad no se pueda actualizar, pero luego, esta entidad se desconectaría, por lo que no serían posibles los intentos accidentales de salvarlos.
Considere el método que utilicé anteriormente: todavía tenemos una entidad modelo parcialmente cargada como resultado. Esta entidad está separada.
Considere este posible código (deseo de existir):
return (from p in Context.Set<Product>()
where p.CategoryID == categoryID
select new Product { Name = p.Name }).AsNoTracking().ToList();
Esto también podría dar como resultado una lista de entidades separadas, por lo que no necesitaríamos hacer dos iteraciones. Un compilador sería inteligente al ver que se ha utilizado AsNoTracking (), lo que dará como resultado entidades separadas, por lo que podría permitirnos hacer esto. Sin embargo, si se omitió AsNoTracking (), podría lanzar la misma excepción que está lanzando ahora, para advertirnos que necesitamos ser lo suficientemente específicos sobre el resultado que queremos.