2012-06-27 9 views
7

चलें कहते हैं कि मैं निम्नलिखित संस्थाओंवापसी इकाई प्रकार जब प्रति प्रकार विरासत तालिका का उपयोग कर

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

public class Cat : Animal 
{ 
} 

public class Dog : Animal 
{ 
} 

है यह उदाहरण बनाकर बिना इकाई के प्रकार का निर्धारण करने के लिए संभव है।

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(); 
} 

एक समाधान मैं निम्नलिखित विधि का उपयोग कर के बारे में सोचा ...

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

मुझे नहीं लगता कि आप कर सकते हैं। – Yeonho

+0

डिजाइन थोड़ा सा गंध करता है; एक सामान्य प्रकार के विशिष्ट उप प्रकार से पूछताछ करना और फिर उस शाखा को बंद करना संभवतः बहुरूपता के साथ प्रतिस्थापित किया जाना चाहिए। – millimoose

+0

आपकी टिप्पणी के बिंदु पर, स्रोत पहले से ही लाया जा चुका है। क्या आप इसे रोकने की कोशिश कर रहे हैं? संपादित करें: अब मैं नहीं देखता हूं। अब समय सोच रहा है। – Michael

उत्तर

2

डेटाबेस के लिए क्वेरी के बिना इस जानकारी प्राप्त करने के लिए कोई तरीका नहीं है। आप टीपीटी का उपयोग कर रहे हैं - इसका मतलब है कि डेटाबेस में पशु, कुत्ते और बिल्ली सारणी शामिल हैं। डेटाबेस में विरासत पशु और कुत्ते और पशु और बिल्ली के बीच एक-से-एक संबंध के माध्यम से बनाई गई है। न्यूनतम जो आपको करना है वह उस आईडी के लिए पशु और कुत्ते तालिकाओं दोनों से पूछताछ है (यह केवल उनमें से एक में मौजूद हो सकता है)। पहली समस्या यह है कि आप इन तालिकाओं को सीधे ईएफ के साथ नहीं पूछ सकते हैं क्योंकि ईएफ केवल पूरी संस्थाओं के साथ काम कर सकता है (न केवल एक तालिका में मैप किए गए हिस्सों के साथ) - आपको सीधे एसक्यूएल का उपयोग करना होगा। दूसरी समस्या इस समाधान की नाजुकता है। यदि आप नई व्युत्पन्न इकाई जोड़ते हैं तो आपको यह क्वेरी ठीक करनी होगी (आपके उदाहरण के लिए भी यही होता है)।

कारण है कि टीपीटी प्रश्नों धीमी गति से कर रहे हैं कि एफई = सब विरासत पेड़ क्वेरी चाहिए अपने मामले AnimalDog concatenated Animal साथ Cat साथ शामिल हो गए साथ शामिल हो गए है। टीपीटी विरासत पेड़ से पूछताछ के लिए .NET 4.5 में कुछ प्रदर्शन सुधार हैं लेकिन यह आपकी क्वेरी को प्रभावित नहीं करेगा क्योंकि इसे केवल पूरी संरचना से पूछना है।

+0

जिज्ञासा से बाहर: क्या आप इस प्रथा का उपयोग करके इस जुर्माना से बच सकते हैं जो केवल 'पशु' में परिभाषित गुणों का उपयोग करता है? – millimoose

संबंधित मुद्दे