Você pode projetar em tipo anônimo e, a partir dele, em 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 });
}
Edit : Eu vou ser um pouco mais específico, pois esta pergunta recebeu muita atenção.
Você não pode projetar diretamente no tipo de modelo (restrição EF); portanto, não há como contornar isso. A única maneira é projetar em tipo anônimo (1ª iteração) e depois em tipo de modelo (2ª iteração).
Lembre-se também de que, quando você carrega parcialmente entidades dessa maneira, elas não podem ser atualizadas; portanto, devem permanecer desanexadas como estão.
Eu nunca entendi completamente por que isso não é possível, e as respostas neste segmento não dão razões fortes contra isso (principalmente falando sobre dados parcialmente carregados). É correto que a entidade no estado parcialmente carregado não possa ser atualizada, mas essa entidade seria desanexada, portanto, tentativas acidentais de salvá-las não seriam possíveis.
Considere o método que usei acima: ainda temos uma entidade de modelo parcialmente carregada como resultado. Esta entidade está desanexada.
Considere este código possível (desejo de existir):
return (from p in Context.Set<Product>()
where p.CategoryID == categoryID
select new Product { Name = p.Name }).AsNoTracking().ToList();
Isso também pode resultar em uma lista de entidades desanexadas, portanto, não precisamos fazer duas iterações. Um compilador seria esperto ao ver que AsNoTracking () foi usado, o que resultará em entidades desanexadas, para que isso nos permita fazer isso. Se, no entanto, AsNoTracking () for omitido, poderá lançar a mesma exceção que está lançando agora, para nos alertar que precisamos ser específicos o suficiente sobre o resultado que queremos.