2011-12-22 21 views
6

मेरे पास डेटा के दो सेट हैं (जटिल वस्तुओं की सूची या एसक्यूएल डेटा - LINQ से Entities) जहां मैं डेटा के दो सेटों के चौराहे को खोजने की कोशिश कर रहा हूं। विशेष रूप से परिसर संपत्ति, "HashData" के एक चौराहे के रूप में नीचे देखी गई:डेटा के दो सेट (सूचियों) का छेड़छाड़

SQL data

बाईं तरफ के सेट, 10000 के बारे में पंक्तियों होने की संभावना है सही पर सेट जबकि हमेशा के बारे में 100 के एक सबसेट है पंक्तियों। मुझे एहसास है कि अगर मैं इसे संग्रहीत करते समय बाईं ओर सेट को "हैशदाता" से सॉर्ट करता हूं, तो खोज करना कुछ प्रकार की बाइनरी सर्च एल्गोरिदम का उपयोग करके बहुत तेज़ होगा, हालांकि मैं इस सवाल से संबंधित कारणों के लिए ऐसा नहीं कर सकता।

डेटा के छोटे सबसेट एसक्यूएल में संग्रहीत कभी नहीं किया गया है (केवल एक एसक्यूएल व्याख्यात्मक प्रयोजनों के लिए नीचे दी गई तालिका में दिखाया)। यह रनटाइम पर List<ShowData> में प्रस्तुत किया गया है।

फिलहाल मैं डेटा के माध्यम से एक दयनीय पाश कर रहा हूँ और इस तरह से मेल खाते (जहां recording 100 पंक्ति सूची है और ShowData 10000 पंक्ति सूची है):

List<ShowData> ShowData = (from showData in context.ShowDatas 
          where (showData.Show.Id == advert.Id) 
          orderby showData.HashData ascending 
          select showData).ToList(); 

foreach (ShowData recording in recordingPoints) { 
    foreach (ShowData actual in ShowData) { 
     if (recording.HashData == actual.HashData) { 
     } 
    } 
} 

तो मूल रूप से क्या im कोशिश कर करने के लिए है:

शोडाटा ऑब्जेक्ट्स (बड़ा सेट) की एक सूची लौटाएं जहां शोडाटा में किसी भी हैशडेटा (छोटे सेट से) पाया जाता है लेकिन LINQ से Entity प्रारंभिक क्वेरी डीबी में मिलता है।

private IEnumerable<ShowData> xyz(List<ShowData> aObj, List<ShowData> bObj) 
    { 
     IEnumerable<string> bStrs = bObj.Select(b => b.HashData).Distinct(); 
     return aObj.Join(bStrs, a => a.HashData, b => b, (a, b) => a); 
    } 

उत्तर

6

जब से तुम IEnumerable उपयोग कर रहे हैं, तो आप इंटरसेक्ट विस्तार विधि का उपयोग कर सकते हैं के बजाय शामिल हों:

मैं के साथ निकट मिला है। यदि आप बड़े सेट को वापस करना चाहते हैं तो आप छोटे सेट के साथ बड़े सेट क्वेरी के परिणाम को छेड़छाड़ करना चाहते हैं। अपने वस्तुओं की तुलना करने के लिए है, तो फोन इंटरसेक्ट विस्तार विधि http://msdn.microsoft.com/en-us/library/bb355408.aspx:

return bStrs.Intersect(aObj, new MyEqualityComparer()); 
+0

हाय जोश तुम जैसा कि यहाँ दिखाया एक IEquality comparer लिखने के लिए की आवश्यकता होगी , मैंने यह कोशिश की: 'सार्वजनिक बूल बराबर (शोडाटा एक्स, शोडाटा वाई) { // जांचें कि तुलना की गई वस्तुएं एक ही डेटा का संदर्भ देती हैं या नहीं। यदि (ऑब्जेक्ट। रेफरेंस एक्वाल्स (एक्स, वाई)) सत्य वापस आते हैं; // जांचें कि तुलना की गई वस्तुओं में से कोई भी शून्य है या नहीं। यदि (ऑब्जेक्ट। रेफरेंस एक्वाल्स (एक्स, नल) || ऑब्जेक्ट। रेफरेंस एक्वाल्स (वाई, नल)) झूठी वापसी; // जांचें कि उत्पाद की संपत्ति बराबर है या नहीं। वापसी x.HashData == y.HashData; } ' – user1112324

+0

लेकिन im यकीन नहीं है कि यह कैसे संकलित रूप में मैं कोई त्रुटि मिलती है: IEnumerable इंटरसेक्ट – user1112324

+0

के लिए एक परिभाषा शामिल नहीं है @ user1112324 - क्या आप वाकई 'System.Linq' और 'के लिए एक' का उपयोग कर के इस बयान को शामिल किया है कर रहे हैं System.Collections.Generic '? इंटरसेक्ट निश्चित रूप से IENumerable का एक विस्तार तरीका है। –

1

कुछ इस तरह (अपरीक्षित चेतावनी) काम कर सकते हैं:

private IEnumerable<ShowData> xyz(List<ShowData> aObj, List<ShowData> bObj) 
{ 
    return aObj.Where(sd1 => bObj.Select(sd2 => sd2.HashData).Contains(sd1.HashData)); 
} 
+0

हाय, मैं इस से ऊपर की कोशिश की, लेकिन मैं जब मैं दो सेट के माध्यम से पुनरावृति के लिए अलग अलग परिणाम प्राप्त और जब मैं ऊपर अपने विधि चलाने मैचों (recording.HashData == actual.HashData) बनाम गिनती: (ShowData IEnumerable शामिल xyz =, recordingPoints); int वापस = = शामिल है।गणना(); – user1112324

+0

यह हो सकता है कि आपकी विधि केवल अद्वितीय मान प्राप्त करे (यानी यदि पहले से ही रिटर्निंग सेट में इसे पढ़ा नहीं गया है)। मुझे इसे पढ़ने की आवश्यकता है भले ही उसके पहले से ही – user1112324

+0

जोश का जवाब आपके उद्देश्यों के लिए बेहतर काम करेगा (हालांकि मुझे यकीन नहीं है कि अगर अंतर केवल अलग-अलग परिणाम प्रदान करता है या नहीं)। –

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