Sie können in den anonymen Typ projizieren und von dort in den Modelltyp
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 : Da diese Frage viel Aufmerksamkeit erregt hat, werde ich etwas genauer werden.
Sie können nicht direkt in den Modelltyp projizieren (EF-Beschränkung), daher gibt es keine Möglichkeit, dies zu umgehen. Die einzige Möglichkeit ist, in den anonymen Typ zu projizieren (1. Iteration) und dann in den Modelltyp (2. Iteration).
Bitte beachten Sie auch, dass Entitäten, die Sie auf diese Weise teilweise laden, nicht aktualisiert werden können, sondern losgelöst bleiben sollten.
Ich habe nie ganz verstanden, warum dies nicht möglich ist, und die Antworten in diesem Thread enthalten keine stichhaltigen Gründe, die dagegen sprechen (meist geht es um teilweise geladene Daten). Es ist richtig, dass in teilweise geladenen Zustand Entität kann nicht aktualisiert werden, aber dann, diese Entität würde abgetrennt werden, so versehentliche Versuche, sie zu speichern wäre nicht möglich.
Betrachten Sie die Methode, die ich oben verwendet habe: Wir haben immer noch eine teilweise geladene Modellentität als Ergebnis. Diese Entität ist losgelöst.
Betrachten Sie diesen (wünschenswerten) 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 von abgetrennten Einheiten führen, so dass wir nicht zwei Iterationen durchführen müssten. Ein Compiler würde erkennen, dass AsNoTracking() verwendet wurde, was zu abgetrennten Entitäten führt, und könnte uns dies erlauben. Wenn jedoch AsNoTracking() weggelassen wurde, könnte er die gleiche Ausnahme wie jetzt auslösen, um uns zu warnen, dass wir das gewünschte Ergebnis genau genug angeben müssen.