6

के माध्यम से LINQ से इकाइयों में मेरी एक ऐसी स्थिति है जहां मैं विभिन्न इकाई फ्रेमवर्क कक्षाओं पर समान संचालन करने के लिए एक एकल व्यावसायिक तर्क वर्ग का उपयोग करना चाहता हूं। मैंने एक इंटरफेस परिभाषित किया है जो ये वर्ग आंशिक वर्ग फ़ाइल में लागू होते हैं।इंटरफ़ेस संपत्ति

हालांकि जब मैं इन इंटरफ़ेस विधियों के खिलाफ एक LINQ लिखने के लिए LINQ लिखने का प्रयास करता हूं, तो मुझे एक असमर्थित अपवाद प्राप्त होता है क्योंकि क्वेरी क्लास के गुणों का उपयोग सीधे नहीं बल्कि इंटरफ़ेस के माध्यम से करती है।

मैं डेटाबेस स्तर पर भारी भारोत्तोलन रखना चाहता हूं, तो क्या LINQ को ऑब्जेक्ट्स का उपयोग किए बिना इसे हासिल करने का कोई तरीका है?

यहां कुछ कोड है जो मेरी समस्या का प्रदर्शन करता है (यह एक कारखाने द्वारा बनाई गई एक सामान्य भंडार वर्ग का उपयोग कर रहा है)।

public interface INamedEntity 
{ 
    int ID { get; set; } 
    string Name { get; set; } 
} 

// This is an Entity Framework class which has CustomerID and CustomerName properties. 
public partial class Customer: INamedEntity 
{ 
    int INamedEntity.ID 
    { 
     get { return this.CustomerID; } 
     set { this.CustomerID = value; } 
    } 
    string INamedEntity.Name 
    { 
     get { return this.CustomerName; } 
     set { this.CustomerName = value; } 
    } 
} 

... 

public string GetName<T>(int entityID) where T: EntityObject, INamedEntity 
{ 
    using(var repository = RepositoryFactory.CreateRepository<T>()) 
    { 
     return repository 
      .Where(e => e.ID == entityID) 
      .Select(e.Name) 
      .Single(); 
    } 
} 

उत्तर

0

निम्नलिखित अपवाद एक सामान्य स्रोत के आधार पर क्वेरी निष्पादन के दौरान होता है और जहां खंड में उपयोग किए गए इंटरफ़ेस सदस्य के साथ होता है।

NotSupportedException: इंटरफ़ेस सदस्य [इंटरफेसनाम] का मानचित्रण। [सदस्य नाम] समर्थित नहीं है।

अपवाद तब होता है जब क्वेरी एकाधिक आइटम लौटाती है और जब मैंने == ऑपरेटर का उपयोग किया था। मैं फर्स्ट, फर्स्टऑर्डफॉल्ट या सिंगल के साथ क्वेरी निष्पादित करते समय त्रुटि को दोबारा उत्पन्न नहीं कर सका, या जब मैंने खंड में अन्य बराबर या अन्य ऑपरेटर का उपयोग किया था।

संदर्भ: Interface not supported

+0

हां, यह समस्या की तरह दिखता है। – gareththegeek

5

यह समर्थित नहीं है। आपकी लिंक-टू-एंटिटीज क्वेरी आपकी इकाइयों के केवल मैप किए गए गुणों का उपयोग कर सकती है। यदि आप इंटरफ़ेस गुणों का उपयोग करते हैं तो ईएफ को यह नहीं पता कि उन्हें SQL में कैसे परिवर्तित किया जाए क्योंकि यह संपत्ति कार्यान्वयन में आपके कोड का विश्लेषण करने में सक्षम नहीं है।

इकाइयों के लिए इंटरफेस का उपयोग न करें - ईएफ इसका समर्थन नहीं करता है। आपके विशेष मामले में यह किसी अन्य ओआरएम के साथ भी काम नहीं करेगा क्योंकि आप उन गुणों पर पूछताछ कर रहे हैं जो मैपिंग के लिए अज्ञात हैं। इसके लिए आपको वास्तविक मैप किए गए गुणों के साथ क्वेरी करने के लिए अपनी क्वेरी का अनुवाद करने के लिए अपना स्वयं का लिंक प्रदाता बनाना होगा।

+0

लेकिन इस तरह के पैटर्न को प्राप्त करने का कोई तरीका है। आदर्श रूप से कार्यशीलता के प्रत्येक क्षेत्र, इंटरफ़ेस पर काम करने और सभी प्रासंगिक इकाइयों के लिए मैपिंग के लिए व्यावसायिक तर्क इकाइयां होंगी। – gareththegeek

+1

लेकिन इसका अर्थ ईएफ के शीर्ष पर एक और "मैपिंग" परत है जो आपके व्यापार तर्क इंटरफ़ेस गुणों को वास्तविक ईएफ गुणों में अनुवादित करेगा। यह मैपिंग परत प्रश्नों को भी बदल देगा। मैं इस पैटर्न को नहीं बुलाता - मैं इसे आर्किटेक्टेड एप्लिकेशन पर कॉल करता हूं। –

+0

शायद अधिक से अधिक आर्किटेक्टेड, लेकिन आप एक ही कोड को कई व्यावसायिक परत ऑब्जेक्ट्स में कॉपी और पेस्ट करने से कैसे बचते हैं ताकि वे एक ही तर्क कर सकें, लेकिन अलग-अलग नामित इकाई गुणों का उपयोग कर सकें? – gareththegeek