2011-01-18 25 views
6

मेरे पास एक क्वेरी है जो धीमी गति से चल रही है (लगभग 100 के लूप में इसमें 5-10 सेकंड लगते हैं) और कोई संकेत नहीं है। यह वस्तुओं की सूची के खिलाफ बस पूछताछ कर रहा है ... आपकी मदद बहुत सराहना की है!धीमी LINQ क्वेरी

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

मैंने गणना करने की कोशिश की। पहले दिन। लेकिन इससे मदद नहीं मिली। जब मैंने प्रदर्शन परीक्षण चलाया तो उसने नीचे दिए गए "से" कथन को हाइलाइट किया।

List<Schedule> _schedule = Schedule.GetAll(); 
List<Shift> _shifts = Shift.GetAll(); 

// Then later... 
List<Schedule> filteredSchedule = (from sch in _schedule 
            from s in _shifts 
            where 
             **sch.ShiftID == s.ShiftID 
             & (sch.ManagerID == 1 | sch.ManagerID == 2 | sch.ManagerID == 3) 
             & ((s.ScheduleWeek == shift.ScheduleWeek) 
               | (s.ScheduleWeek == shift.ScheduleWeek.AddDays(7) 
                 & (s.DayOfWeek == 1 | s.Code == 2)) 
               | (sch.ScheduleWeek == shift.ScheduleWeek.AddDays(-7) 
                 & (s.DayOfWeek == 5 | s.Code == 6)))** 
            select sch) 
            .OrderBy(sch => sch.ScheduleWeek) 
            .ThenBy(sch => sch.DayOfWeek) 
            .ToList(); 

उत्तर

7

पहला पड़ाव: && बजाय & और || बजाय | का उपयोग करें। अन्यथा सभीwhere खंड में उप-अभिव्यक्तियों का मूल्यांकन किया जाएगा, भले ही उत्तर पहले ही ज्ञात हो।

कॉल का दूसरा बंदरगाह: एक एक जहां के साथ खंड "से" दो के बजाय में शामिल होने का उपयोग करें:

var filteredSchedule = (from sch in _schedule 
         join s in _shifts on s.ShiftID equals sch.ShiftID 
         where ... rest of the condition ... 

मूल रूप से है कि सभी पारी आईडी की एक हैश बनाने के लिए जा रहा है, तो यह जल्दी से देख सकते हैं प्रत्येक शेड्यूल के लिए संभव मैचों।

+0

सबसे पहले, धन्यवाद जॉन! मैंने पहले इसे छोटा सर्किट किया था लेकिन कोई अंतर नहीं देखा। हालांकि "कहां" काम करने के बजाय "शामिल" का उपयोग करना! मुझे कभी नहीं पता था कि LINQ ने 2 अलग-अलग व्यवहार किया था। दूसरा - वाह! मुझे लगता है कि मुझे सिर्फ एक सेलिब्रिटी से मदद मिली है! :) मैंने कभी आपकी पुस्तक नहीं पढ़ी लेकिन इसे कई बार देखा है। आप सुनिश्चित कर सकते हैं कि मैं अब एक प्रतिलिपि उठाउंगा। :) पी। यदि आप कभी डेवलपर की तलाश में हैं तो मुझे बताएं! यानी आपकी अगली पुस्तक सह-लेखक बनने के लिए! haha – jon

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