2016-02-12 15 views
5

Çok tuhaf bir sorun yaşıyorum: ToList() uzantı yöntemi sonuçları bir listeye dönüştüremiyor. İşte benim kod, standart klişe linq sorgusu henüz varlıkları hala System.Data.Entities.DynamicProxies listesi ....Linq ToList() Anlık Yürütme'yi başlatılamıyor

Daha önce bu sorunu hiç olmadı, iyi tedbir

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; 

iki kez ToList() dönüştürdü.

+0

Aynı değişken için neden ToList() kullanıyorsunuz? –

+0

İkinci 'ToList()', 'ToList()' sonucunu kullanmadığınız için hiçbir şey yapmaz. –

+0

İkinci ToList() öğesinin fazla olduğunu biliyorum, sadece test etmek istedim. – franklores

cevap

8

Nedeni tembel yükleme. Tembel yükleme EF'de (varsayılan olarak) etkinleştirildiğinde, (varsayılan olarak) EF her varlık için dinamik proxy'ler oluşturur. İlgili varlıkları yüklemek için gereklidir. Dinamik proxy, varlık sınıfından miras alınacaktır. Bu durumda sizin durumunuzda Asset'dan miras alınacaktır. Ancak dinamik proxy, örneğini oluşturan bağlama referans gösterecektir. Ve dinamik proxy'de depolanan bağlam yoluyla varlıkları sorgulamak için gezinme özelliklerini (sanal olan) geçersiz kılar.

Temel türlerin listesine türetilmiş türlerin örneklerini eklemek tamamen yasaldır.

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

Teknik olarak sadece turn-off proxy üretimi ve tembel yükleme çalışmaz yapabilirsiniz: dinamik proxy'leri istemiyorsanız

, o zaman sadece tembel yükleme ve vekil oluşturulmasını devre dışı bırakın. Ama her iki ayarı da açıkça kapatmayı tercih ediyorum.

+0

Bildirimi ekledim, ancak hala çalışmıyor. kullanılarak (var CTX = yeni LeaseContext()) \t \t \t { \t \t \t \t ctx.Configuration.LazyLoadingEnabled = false; \t \t \t \t assets = ctx.Assets.OrderBy (o => o.Reference) .Where (w => w.Status == AssetStatus.Active) .Select (x => x) .ToList(); \t \t \t} \t \t \t \t \t \t dönüş varlıkları; – franklores

+0

@franklores Bu cümlenin içeriğini eklemek için 'cxt' kullanmadan önce varlıklar –

+0

@franklores özür dilerim, ikinci yapılandırma ayarını unuttum - proxy'lerin oluşturulmasını devre dışı bırakmak için ayrı bir tane var –