2011-06-07 22 views
14

içer Ben yaparım:İstekli yükleme özelliği Ben gibi sınıfları

var persons = Context.Persons 
       .OfType<Employee>() 
       .Include("Compensation"); 

Ancak Çalışanlar ve ziyaretçileri aynı sorguya almak istiyorum. http://data.uservoice.com/forums/72025-ado-net-entity-framework-ef-feature-suggestions/suggestions/1249289-include-property-of-derived-classes?ref=title

ama yakın zamanda yapılabilir alacak gibi görünmüyor: orada EF4'ü UserVoice bu özellik için bir talep gibi

görünüyor.

Bu sorun için iyi bir çözüm nedir?

cevap

7

Sen bu şekilde deneyebilirsiniz:

var persons = Context.Persons 
        .OfType<Employee>() 
        .Include("Compensation") 
        .Concat<Person>(Context.Persons.OfType<Visitor>()); 
+0

değiştirme concat hattı temel

: .Concat (Context.Persons.OfType ()); aksi halde derleme yapmaz. Çalışırken hala orijinal sorudaki aynı hatayı al. –

+0

@Ladislav, Benim senaryoda, "Kişi" türü soyut değil, yalnızca "Kişi" olan "Çalışan" veya "Ziyaretçi" olmayan varlıklar var. Örneğiniz bana ** 'Person' ** s vermeyecek. 'Person' sorgusunu birleştirmeye çalışmak OP tarafından bildirilen istisnalara neden olur. Herhangi bir geçici çözüm gerçekten takdir edilecektir (benim durumumda 'Kişi' değil, 'İşlem' ama her neyse). – Shimmy

+0

@Shimmy: Sorunun bir örneği ile ayrı bir soru sorun ve bunu referans alın. Yorumlar başka (hatta benzer) bir problemi çözmek için uygun değildir. –

0

Bu korkunç bir şey çalışır:

var persons = context.Persons 
       .Concat(context.Employees 
        .Where(e => e.Compensation.Amount >= 0)) 
       .Concat(context.Visitors 
        .Where(v => v.SomeProperty == "AlwaysTrue")); 

Neden emin değilim ama bir obje özelliğine filtrelediğinizde, tesisin nesnedir hevesle yüklü. Bu mülkü filtrelemek istemiyorsanız, her zaman doğru olan bir koşul kullanın.

Yasal Uyarı: Sonuçta oluşan sorgunun ne kadar verimli olduğu hakkında hiçbir fikrim yok. Bunu biraz daha karmaşık bir senaryoda test ettiğimde üretilen sql'yi kontrol ettim ve çok büyüktü.

+0

Bu çılgınca ... Bu işi yapmaya çalışıyorum ama navigasyon mülküm bir koleksiyon. Bunun hakkında bir fikrin var mı? Denediğim her şey koleksiyonu yüklemiyor. – julealgon

2

İşte Persons yüklemek ve bir toplama özelliği için Collection() tarafından Reference() değiştirin Compensation

Employees için nasıl dahil edileceği güzel bir örnek.

IQueryable<Person> GetPersons() 
{ 
    var persons = Context.Persons; 
    foreach(var entry in persons.OfType<Employee>()) 
     Context.Entry(entry).Reference(e => e.Compensation).Load(); 
    return persons; 
} 

Ya verimli olup olmadığından emin değil, ancak çalışır ve niyet birleştirmelerden daha nettir. Bu SO answer

2
var employees = context.Persons.OfType<Employee>().Include(x => x.Compensation).ToArray(); 

var nonEmployees = context.Persons.Except(context.Persons.OfType<Employee>()).ToArray(); 

var people = employees.Concat(nonEmployees); 
İlgili konular