Możesz rzutować na anonimowy typ, a następnie z niego na typ modelu
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 });
}
Edycja : Będę bardziej szczegółowy, ponieważ to pytanie zyskało wiele uwagi.
Nie można rzutować bezpośrednio na typ modelu (ograniczenie EF), więc nie można tego obejść. Jedynym sposobem jest rzutowanie na typ anonimowy (pierwsza iteracja), a następnie na typ modelu (druga iteracja).
Należy również pamiętać, że gdy częściowe ładowanie w ten sposób jest częściowe, nie można ich aktualizować, więc powinny pozostać odłączone, ponieważ są.
Nigdy do końca nie rozumiałem, dlaczego nie jest to możliwe, a odpowiedzi w tym wątku nie dają mocnych powodów do tego (głównie mówiąc o częściowo załadowanych danych). Prawdą jest, że w stanie częściowo załadowanym nie można zaktualizować encji, ale wtedy ta encja zostanie odłączona, więc przypadkowe próby ich zapisania nie byłyby możliwe.
Zastanów się nad metodą, której użyłem powyżej: w rezultacie nadal mamy częściowo załadowany element modelu. Ten byt jest odłączony.
Rozważ ten (możliwy do istnienia) kod:
return (from p in Context.Set<Product>()
where p.CategoryID == categoryID
select new Product { Name = p.Name }).AsNoTracking().ToList();
Może to również prowadzić do utworzenia listy odłączonych jednostek, więc nie musielibyśmy wykonywać dwóch iteracji. Kompilator byłby mądry, gdyby zobaczył, że użyto AsNoTracking (), co spowoduje odłączenie encji, co pozwoli nam to zrobić. Gdyby jednak pominięto AsNoTracking (), mógłby on zgłosić ten sam wyjątek, który jest teraz zgłaszany, aby ostrzec nas, że musimy być wystarczająco konkretni w kwestii oczekiwanego rezultatu.