2012-06-27 16 views
7

bir örneğini oluşturmadan varlığın türünü belirlemek mümkün mü aşağıdaki varlıklarıDönüş varlık türü

public abstract class Animal 
{ 
    public int Id {get;set;} 
} 

public class Cat : Animal 
{ 
} 

public class Dog : Animal 
{ 
} 

var düşünelim. Aşağıdaki yöntemi kullanarak düşündünüz

var id = 1; 
var type = context.Animals.GetTypeOfAnimal(id) 

public static Type GetTypeOfAnimal(this ObjectSet<Animal> source, int id) 
{ 
    // What shall I do here, I dont want to fetch the instance at this point... 
    var animal = source.First(a => a.Id == id); 
    return animal.GetType(); 
} 

bir çözüm ...

public static Type GetTypeOfAnimal(this ObjectSet<Animal> source, int id) 
{ 
    var info = source.Where(a => a.Id == id).Select(a => new {IsDog = a is Dog, IsCat = a is Cat}).First(); 

    if(info.IsDog) return typeof(Dog); 
    if(info.IdCat) return typeof(Cat); 

    return null; 
} 
+1

Yapabileceğinizi sanmıyorum. – Yeonho

+0

Tasarım biraz da kokuyor; Jenerik tipin spesifik alt tipini sorgulamak ve daha sonra polimorfizm ile değiştirilmesi gereken dallanma. – millimoose

+0

Yorumunuzun yapıldığı noktada, kaynak zaten alınmış. Bunu engellemeye çalıştığın şey mi? DÜZENLEME: Hayır şimdi görüyorum. Düşünme zamanı şimdi. – Michael

cevap

2

veritabanına sorgu olmadan bu bilgileri almak için bir yolu yoktur. TPT kullanıyorsunuz - bu veritabanı Hayvan, Köpek ve Kedi tabloları içeriyor demektir. Veritabanındaki kalıtım Hayvan ile Köpek arasındaki ve Hayvan ile Kedi arasındaki bire bir ilişki ile modellenmiştir. Yapmanız gereken minimum şey, bu Kimlik için hem Hayvan hem de Köpek tablolarını sorgulamaktır (yalnızca birinde olabilir). İlk sorun, EF ile bu tabloları doğrudan sorgulayamamanızdır, çünkü EF sadece tüm varlıklar ile çalışabilir (sadece tek bir tablo ile eşlenmiş parçalarla değil) - doğrudan SQL kullanmalısınız. İkinci problem bu çözümün kırılganlığıdır. Yeni türetilmiş varlık eklerseniz, bu sorguyu düzeltmeniz gerekir (örneğiniz için aynı şey gerçekleşir).

TPT sorguları yavaş olmasının nedeni EF AnimalCat ile katıldı ile birleştirilmiş Dog ile katıldı davanızı Animal yılında = bütün miras ağacını sorgulamak gerektiğidir. TPT devralma ağacını sorgulamak için .NET 4.5'te bazı performans geliştirmeleri vardır, ancak tüm yapının sorgulanması gerektiğinden, sorgunuzu etkilemez.

+0

Sadece meraktan dolayı: "Hayvan" da tanımlanan özellikleri kullanan bir projeksiyon kullanarak bu cezayı önleyebilir misiniz? – millimoose

İlgili konular