Sie können in einen anonymen Typ und dann in einen Modelltyp projizieren
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 : Ich werde etwas genauer sein, da diese Frage viel Aufmerksamkeit bekommen hat.
Sie können nicht direkt in den Modelltyp projizieren (EF-Einschränkung), daher führt kein Weg daran vorbei. Die einzige Möglichkeit besteht darin, in einen anonymen Typ (1. Iteration) und dann in einen Modelltyp (2. Iteration) zu projizieren.
Beachten Sie auch, dass beim teilweisen Laden von Entitäten auf diese Weise diese nicht aktualisiert werden können. Daher sollten sie unverändert bleiben.
Ich habe nie ganz verstanden, warum dies nicht möglich ist, und die Antworten in diesem Thread geben keine starken Gründe dafür (meistens über teilweise geladene Daten). Es ist richtig, dass in einem teilweise geladenen Zustand die Entität nicht aktualisiert werden kann, diese Entität jedoch getrennt wird, sodass versehentliche Versuche, sie zu speichern, nicht möglich sind.
Betrachten Sie die oben verwendete Methode: Als Ergebnis haben wir immer noch eine teilweise geladene Modellentität. Diese Entität ist getrennt.
Betrachten Sie diesen (Wunsch zu existieren) möglichen Code:
return (from p in Context.Set<Product>()
where p.CategoryID == categoryID
select new Product { Name = p.Name }).AsNoTracking().ToList();
Dies könnte auch zu einer Liste getrennter Entitäten führen, sodass wir keine zwei Iterationen durchführen müssten. Ein Compiler wäre schlau zu sehen, dass AsNoTracking () verwendet wurde, was zu getrennten Entitäten führt, sodass wir dies tun könnten. Wenn jedoch AsNoTracking () weggelassen wurde, könnte es dieselbe Ausnahme auslösen wie jetzt, um uns zu warnen, dass wir genau genug über das gewünschte Ergebnis sein müssen.