2010-02-19 21 views
9

मुझे नहीं पता कि मैं एक अलग के साथ कई संघ कैसे कर सकता हूं।इकाइयों के लिए लिंक: यूनियन + विशिष्ट

जब मैं एक IEqualityComparer साथ .Distinct का उपयोग एक अपवाद में फेंक दिया:

संस्थाओं को LINQ विधि 'System.Linq.IQueryable'

मेरे कोड

है नहीं पहचानता है
var union = query.Union(query1).Union(query2); 
union = union.Distinct(new EqualityComparerTransaction()); 

उत्तर

10

LINQ से संस्थाएं Distinct के अधिभार का समर्थन नहीं करती हैं जो IEqualityComparer लेती है। जब आप इसके बारे में सोचते हैं, तो यह वास्तव में नहीं कर सकता है, क्योंकि LINQ से Entities क्वेरी को SQL में परिवर्तित कर दिया जाएगा, और आप SQL पर इंटरफ़ेस संदर्भ को परिवर्तित नहीं कर सकते हैं।

इसलिए, आप या तो:

  1. Distinct के अधिभार का उपयोग करें, जो वस्तुओं के लिए LINQ में नहीं ले करता है किसी भी तुलना करें या
  2. वस्तु अंतरिक्ष में दोनों सूचियों लाओ और कर Distinct इस तरह :

    var union = query.Union(query1).Union(query2); 
    union = union.AsEnumerable().Distinct(new EqualityComparerTransaction()); 
    

स्वाभाविक रूप से, जोखिम यहाँ है कि आप भी कई आर लाने सकता है डीबी सर्वर से वापस पारिस्थितिकी। आप सर्वर पर तुलना के एक हिस्से और ऑब्जेक्ट स्पेस में एक और भाग करने के लिए इन दोनों तकनीकों का भी उपयोग कर सकते हैं।

+0

आपके उत्तरों के लिए धन्यवाद! मुझे लगता है कि मैं दोनों तकनीकों का उपयोग करने जा रहा हूं। जैसे मैंने सर्वर साइड पेजिंग का उपयोग किया, यह आसान नहीं है ... – lu2vik

0

प्रश्न का उत्तर दिया गया लेकिन मैं बस अपना अनुभव साझा करना चाहता हूं।

यकीन नहीं है, लेकिन मुझे लगता है कि त्रुटि संदेश कहने के साथ चला जाता है कि अलग-अलग विधि इस तर्क के साथ समर्थित नहीं है।

असल में हम सिर्फ लिंक से एसक्यूएल चाहते हैं, एक क्वेरी करने योग्य अभिव्यक्ति जो कहती है कि क्या यह गुण समान रूप से उनमें से एक है।

लेकिन जब हम इक्वालिटी कॉम्पैयरट्रांसक्शन जैसी कक्षा का उपयोग करते हैं तो इसका सामान्य रूप से एसक्यूएल में अनुवाद नहीं किया जा सकता है।

एक और तरीका है GetDistict < टी> (स्ट्रिंग प्रॉपर्टीनाम) लेकिन दुख की बात यह है कि यह काम नहीं करता है जैसा कि हम उम्मीद करते हैं। यह विधि डीबी (हमारे स्रोत और क्या) पर जाती है और कुछ डेटा प्राप्त करती है और अलग-अलग मूल्यांकन करती है।

यदि GetDistinct (स्ट्रिंग प्रॉपर्टीनाम) विस्तार विधि एसक्यूएल कनवर्शन ऑपरेशन किया जा सकता है यह हो सकता है। लेकिन कोई रास्ता नहीं है।

अफसोस की बात यह है कि LINQ_TO_SQL के लिए अपना स्वयं का विशिष्ट विस्तार कोडिंग कर रहा है। मुझे नहीं लगता कि यह आसान होगा! तो सर्वर पक्ष पर डेटा को समझना अब के लिए सबसे आसान लगता है।