È possibile proiettare in un tipo anonimo e quindi da esso al tipo di modello
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 });
}
Modifica : sarò un po 'più specifico poiché questa domanda ha suscitato molta attenzione.
Non è possibile proiettare direttamente nel tipo di modello (restrizione EF), quindi non è possibile aggirare il problema. L'unico modo è proiettare in tipo anonimo (1a iterazione), quindi in tipo modello (2a iterazione).
Si noti inoltre che quando si caricano parzialmente le entità in questo modo, non possono essere aggiornate, quindi devono rimanere staccate, così come sono.
Non ho mai capito del tutto perché questo non è possibile e le risposte su questo thread non danno forti ragioni contro di esso (soprattutto parlando di dati parzialmente caricati). È corretto che l'entità di stato parzialmente caricata non possa essere aggiornata, ma quindi questa entità verrebbe staccata, quindi non sarebbero possibili tentativi accidentali di salvarle.
Considera il metodo che ho usato sopra: abbiamo ancora un'entità modello parzialmente caricata come risultato. Questa entità è distaccata.
Considera questo (possibile esistere) codice possibile:
return (from p in Context.Set<Product>()
where p.CategoryID == categoryID
select new Product { Name = p.Name }).AsNoTracking().ToList();
Ciò potrebbe anche comportare un elenco di entità distaccate, quindi non avremmo bisogno di fare due iterazioni. Un compilatore sarebbe intelligente nel vedere che AsNoTracking () è stato utilizzato, il che si tradurrà in entità distaccate, quindi potrebbe permetterci di farlo. Se, tuttavia, AsNoTracking () fosse omesso, potrebbe lanciare la stessa eccezione che sta lanciando ora, per avvertirci che dobbiamo essere abbastanza specifici sul risultato che vogliamo.