Vous pouvez projeter dans un type anonyme, puis à partir de celui-ci vers le type de modèle
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 });
}
Éditer : Je vais être un peu plus précis car cette question a attiré beaucoup d'attention.
Vous ne pouvez pas projeter directement dans le type de modèle (restriction EF), il n'y a donc aucun moyen de contourner cela. La seule façon est de projeter en type anonyme (1ère itération), puis de modéliser le type (2ème itération).
Sachez également que lorsque vous chargez partiellement des entités de cette manière, elles ne peuvent pas être mises à jour, elles doivent donc rester détachées telles quelles.
Je n'ai jamais complètement compris pourquoi cela n'est pas possible, et les réponses sur ce fil ne donnent pas de raisons solides contre cela (parlant principalement de données partiellement chargées). Il est exact que, dans un état partiellement chargé, l'entité ne peut pas être mise à jour, mais alors, cette entité serait détachée, de sorte que des tentatives accidentelles de les enregistrer ne seraient pas possibles.
Considérez la méthode que j'ai utilisée ci-dessus: nous avons toujours une entité de modèle partiellement chargée. Cette entité est détachée.
Considérez ce code (souhait d'exister) possible:
return (from p in Context.Set<Product>()
where p.CategoryID == categoryID
select new Product { Name = p.Name }).AsNoTracking().ToList();
Cela pourrait également entraîner une liste d'entités détachées, nous n'aurions donc pas besoin de faire deux itérations. Un compilateur serait intelligent de voir que AsNoTracking () a été utilisé, ce qui entraînera des entités détachées, il pourrait donc nous permettre de le faire. Si, cependant, AsNoTracking () était omis, il pourrait lever la même exception qu'il lance maintenant, pour nous avertir que nous devons être suffisamment précis sur le résultat que nous voulons.