2012-10-01 13 views
5

एंटीटी फ्रेमवर्क LINQ का उपयोग करके, मैं प्रत्येक मूल तालिका के लिए एक अभिभावक वर्ग वापस करना चाहता हूं और एक संपत्ति को पॉप्युलेट करना चाहता हूं, जिसका प्रकार एक इंटरफ़ेस है, जिसमें कई ठोस कार्यान्वयन के साथ मूल वर्ग पर एक इंटरफ़ेस का। मूल तालिका में किसी फ़ील्ड के मान के आधार पर क्वेरी समय पर कौन सा ठोस कार्यान्वयन निर्धारित किया जाना चाहिए।ईएफ 4 इंटरफ़ेस में कंक्रीट प्रकार डालने में असमर्थ

एक बहुत ही सरल उदाहरण में, मेरे पास 3 टेबल और 3 संबंधित पीओसीओ हैं।

उदाहरण के लिए सरल टेबल

Three Tables: Master and two children

उदाहरण की खातिर

internal interface IConfiguration 
{ 
} 

internal class ConfigurationContainer 
{ 
    public IConfiguration Config { get; set; } 
} 

internal class ConfigurationSouth : IConfiguration 
{ 
} 

internal class ConfigurationNorth : IConfiguration 
{ 
} 

दुर्भाग्य के लिए सरल कक्षाएं, मैं सभी माता पिता परिणामों के माध्यम से पाश और जो निर्धारित लूप के अंदर उपयोग करने के लिए subquery। कुछ इस ब्लॉक की तरह।

foreach (var configMaster in db.ConfigMasters.ToList()) 
{ 
    var configContainer = new ConfigurationContainer(); 
    if (configMaster.IsNorth) 
     configContainer.Config = (from x in db.ConfigNorths 
          select new ConfigurationNorth()) 
             .FirstOrDefault(); 
    else 
     configContainer.Config = (from x in db.ConfigSouths 
          select new ConfigurationSouth()) 
             .FirstOrDefault(); 
} 

सबक्वायरी करने के लिए प्रत्येक अभिभावक रिकॉर्ड के माध्यम से लूपिंग इष्टतम से कम है। मैं वास्तव में डेटाबेस के लिए एक यात्रा में क्वेरी करने के साथ-साथ अपने पीओसीओ में अनुमान लगाने के लिए ईएफ LINQ पसंद करूंगा।

मैं इस LINQ के साथ एक यात्रा में डेटाबेस से पूछताछ करने के लिए आया था और अनुमानित वस्तुओं को वापस लौटाता हूं जैसे कि कॉन्फ़िगरेशन संपत्ति क्वेरीक्टाइम पर दो उपक्वियों में से एक द्वारा पॉप्युलेट की जाएगी। हालांकि यह संकलित करता है, यह रनटाइम पर अपवाद फेंकता है।

using (var db = new Entities()) 
{ 
    var qry = from cfgMaster in db.ConfigMasters 
       let configNorth = (from x in db.ConfigNorths 
            select new ConfigurationNorth()) 
        .FirstOrDefault() 
       let configSouth = (from x in db.ConfigSouths 
            select new ConfigurationSouth()) 
        .FirstOrDefault() 
       select new ConfigurationContainer() 
        { 
         Config = cfgMaster.IsNorth ? configNorth : (IConfiguration) configSouth 
        }; 

    var results = qry.ToList(); 
} 

अपवाद

बिना क्रिया के अपवाद: System.NotSupportedException: 'EFTest.IConfiguration' टाइप करने के लिए प्रकार 'EFTest.ConfigurationNorth' कास्ट करने में असमर्थ। LINQ इकाइयों को केवल एंटिटी डेटा मॉडल आदिम प्रकार कास्टिंग का समर्थन करता है।

+0

यह केवल तभी किया जा सकता है जब आप दोनों कक्षाओं को बेस क्लास से प्राप्त करते हैं जो मॉडल का हिस्सा भी है। –

+0

:(दुर्भाग्यवश, ऐसा लगता है कि आप सही हैं। अगर आप इसे उत्तर के रूप में पोस्ट करते हैं, तो मैं इसे स्वीकार करूंगा। –

उत्तर

1

इकाई फ्रेमवर्क (अभी तक?) इंटरफेस के उपयोग का समर्थन नहीं करता है, मूल रूप से क्योंकि इंटरफ़ेस मॉडल के साथ पंजीकृत नहीं है (और नहीं हो सकता है)। आप जो चाहते हैं वह केवल तभी संभव है जब आप दोनों वर्गों को बेस क्लास से प्राप्त कर सकें जो मॉडल का हिस्सा भी है।

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