2016-02-12 34 views
5

Mam bardzo osobliwy problem: metoda rozszerzenia ToList() nie może przekonwertować wyników na listę. tutaj jest mój kod, standardowe zapytania boilerplate LINQ, I konwertowane ToList() dwukrotnie na dokładkęFunkcja Linq ToList() nie uruchamia natychmiastowej realizacji

var assets = new List<Asset>(); 

using (var ctx = new LeaseContext()) 
{ 
    assets = ctx.Assets.OrderBy(o => o.Reference).Where(w => w.Status == AssetStatus.Active).ToList(); 

    assets.ToList(); 
} 

return assets; 

jeszcze aktywa są nadal lista System.Data.Entities.DynamicProxies ....

Nigdy nie miałem tego problemu wcześniej.

+0

Dlaczego używasz ToList() dla tej samej zmiennej? –

+0

Drugie 'ToList()' nie robi nic, ponieważ nie używasz wyniku 'ToList()'. –

+0

Wiem, że druga funkcja ToList() jest zbyteczna, chciałem tylko przetestować. – franklores

Odpowiedz

8

Powodem jest leniwy ładowanie. Jeśli w EF (domyślnie) włączone jest opóźnione ładowanie, to (ponownie domyślnie) EF tworzy dynamiczne serwery proxy dla każdej jednostki. Jest wymagany do ładowania powiązanych obiektów. Dynamiczny serwer proxy zostanie odziedziczony z klasy encji. W twoim przypadku zostanie on odziedziczony po Asset. Ale dynamiczny proxy będzie miał odniesienie do kontekstu, który utworzył jego instancję. I zastąpi właściwości nawigacji (które są wirtualne), aby wyszukiwać jednostki za pomocą kontekstu, który jest przechowywany w dynamicznym proxy.

Dodanie instancji typów pochodnych do listy typów bazowych jest całkowicie legalne.

Jeśli nie chcesz dynamiczne proxy, a potem po prostu wyłączyć leniwy załadunku i tworzenie Proxy:

ctx.Configuration.LazyLoadingEnabled = false; // turn-off loading on-demand 
ctx.Configuration.ProxyCreationEnabled = false; // turn-off wrapper class generation 

Technicznie można po prostu wyłączania generacja proxy i leniwy ładowanie nie będzie działać. Ale wolę jednoznacznie wyłączyć oba ustawienia.

+0

Dodałem oświadczenie, ale nadal nie działa. stosując (var CTX = nowy LeaseContext()) \t \t \t { \t \t \t \t ctx.Configuration.LazyLoadingEnabled = fałszywe; \t \t \t \t assets = ctx.Assets.OrderBy (o => o.Reference) .Where (w => w.Status == AssetStatus.Active). Wybierz (x => x) .ToList(); \t \t \t} \t \t \t \t \t \t Wartości powrotu; – franklores

+0

@franklores należy dodać tę instrukcję przed użyciem 'cxt' do kwerendy aktywów –

+0

@franklores przepraszam, zapomniałem o drugim ustawieniu konfiguracji - jest osobny dla wyłączenia tworzenia proxy –