2012-04-11 11 views
11

के साथ == और .quals() के बीच अंतर मुझे हाल ही में "इंटरफ़ेस सदस्य का मैपिंग ..... समर्थित नहीं है" त्रुटि मिली है, जिसे मैंने this thread पर आधारित किया था। प्रदर्शित करने के लिए: "इंटरफेस सदस्य IMyInterface.valueText की मैपिंग समर्थित नहीं है":इंटरफ़ेस और LINQ

public interface IMyInterface { string valueText { get; set; } } 
public class MyData : IMyInterface 
{ 
    int ID { get; set;} 
    string valueText { get; set;} 
} 
public class MyOtherData : IMyInterface 
{ 
    long ID { get; set;} 
    string valueText { get; set;} 
} 

और

public static IEnumerable<T> GetByValue<T>(string value) : where T : class, IMyInterface, new() 
{ 
    using (var context = new DataContext()) 
    { 
     // The important line 
     return context.GetTable<T>().Where(x => x.valueText == value); 
    } 
} 

इस कोड चल रहा है, मैं एक NotSupportedException मिल चाहते हैं। हालांकि, अगर मैं x.valueText == value को x.valueText.Equals(value) के साथ प्रतिस्थापित करता हूं, तो यह पूरी तरह से अपेक्षित काम करता है।

मैंने इसे अपने कोड में हल कर लिया है, लेकिन मैं क्यों समझना चाहता हूं यह इस तरह से व्यवहार करता है। क्या कोई इसे समझा सकता है?

अद्यतन: नीचे दी गई मेरी टिप्पणी के अनुसार, LINQ से SQL टीम ने इसे "ठीक नहीं किया जाएगा" के रूप में बंद कर दिया। मुझे लगता है कि इसका मतलब है कि अब यह एक ज्ञात बग के रूप में गिना जाता है, लेकिन एक ऐसा जिसे जल्द ही हल नहीं किया जा रहा है। मैं अभी भी जानना चाहता हूं कि यह पहले स्थान पर अलग-अलग व्यवहार क्यों करता है।

+0

आपके द्वारा लिंक किए गए थ्रेड को पढ़ने के बाद, मैं कहूंगा कि यह एक बग जैसा दिखता है। – phoog

+0

@ फ़ूग, मैं भी एक बग मानता हूं, सिवाय इसके कि इसमें एक स्पष्ट त्रुटि है। जिसका मतलब है कि उस परिदृश्य के लिए कुछ जांचना है। यह एक बग से बचने के लिए "तर्क जोड़ने के लिए भूल गया" बग, या एक अपवाद कोडित हो सकता है, लेकिन मुझे लगता है कि अपवाद "सही" व्यवहार है। – Bobson

+0

@ बॉब्सन, क्या आपने यह देखने के लिए कनेक्ट की जांच की कि क्या किसी ने कभी भी बग की सूचना दी है? लिंक्ड थ्रेड में कुछ लोगों ने इसके बारे में बात की, लेकिन ऐसा लगता है कि किसी को भी इसे करने के लिए पर्याप्त पहल नहीं थी। – phoog

उत्तर

2

स्पष्ट रूप से सर्वर पर क्वेरी अपस्ट्रीम को धक्का देने का निर्णय नियमों के अपूर्ण सेट के आधार पर किया जाता है, और फिर LINQ-to-SQL एक निर्माण (एक इंटरफ़ेस) पाता है जिसे वह सौदा नहीं कर सकता है।

विधि कॉल LINQ-to-SQL द्वारा समर्थित नहीं है, इसलिए यह सभी रिकॉर्ड्स को पुनर्प्राप्त करने के लिए एक क्वेरी उत्पन्न करता है और फिर उन्हें फ़िल्टर करने के लिए LINQ-to-Objects का उपयोग करता है। (असल में, आपके अन्य थ्रेड के आधार पर, LINQ-to-SQL object.Equals के लिए एक विशेष अपवाद कर सकता है और जानता है कि इसे SQL में कैसे परिवर्तित करें)।

LINQ-to-SQL शायद इंटरफ़ेस में शामिल होने पर LINQ-to-Objects व्यवहार पर वापस आना चाहिए, लेकिन स्पष्ट रूप से यह केवल इसके बजाय अपवाद फेंकता है।

+1

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

+0

यदि लिंक किए गए धागे पर स्वीकृत उत्तर माना जाता है, तो आपका अनुमान गलत है। ऐसा प्रतीत होता है कि लिंक से एसक्यूएल '==' तुलना और 'Equals' कॉल दोनों के लिए एक समान सही SQL (फ़िल्टर के लिए 'WHERE' खंड सहित) उत्पन्न करता है, लेकिन फिर भी '==' तुलना के लिए अपवाद फेंकता है। – phoog

+0

@ बेन, लेकिन यह '==' और 'Equals() 'के बीच अलग-अलग व्यवहार क्यों करता है? जहां तक ​​मुझे पता है, वे दृश्यों के पीछे एक ही चीज़ हैं, और @phoog बताते हैं, वे एक ही एसक्यूएल उत्पन्न करते हैं। – Bobson

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