2010-01-20 14 views
5

मैं एसक्यूएल को LINQ करने के लिए नए और मुझे चाहते हैं पता है कि कैसे LINQ में कुछ इस तरह प्राप्त करने के लिए:LINQ समूह माह प्रश्न द्वारा

 Month Hires Terminations 
     Jan  5  7 
     Feb  8  8 
     Marc  8  5 

मैं इस मिल गया है अब तक, और मैं वहाँ लगता है इसमें कुछ गड़बड़ है लेकिन मुझे यकीन नहीं है:

from term1 in HRSystemDB.Terminations 
group term1 by new { term1.TerminationDate.Month, term1.TerminationDate.Year } into grpTerm 
select new HiresVsTerminationsQuery 
{ 
    Date = Criteria.Period, 
    TerminationsCount = grpTerm.Count(term => term.TerminationDate.Month == Criteria.Period.Value.Month), 
    HiresCount = (from emp in HRSystemDB.Persons.OfType<Employee>() 
       group emp by new { emp.HireDate.Month, emp.HireDate.Year } into grpEmp 
       select grpEmp).Count(e => e.Key.Month == Criteria.Period.Value.Month) 
}); 

अग्रिम धन्यवाद।

+0

हमें दिखा रहा है कि आपका डेटाबेस स्कीमा मदद करेगा। – Blindy

+0

'मानदंड। अवधि 'और' मानदंड। अवधि। वैल्यू.मोन्थ 'क्या है? –

+0

आपको यह सुनिश्चित नहीं होता कि यह सही है? क्या यह संकलित करता है? क्या आपने इसे चलाने की कोशिश की है? क्या यह आपके द्वारा अपेक्षित परिणाम देता है? –

उत्तर

6

मुझे पूरा यकीन नहीं है कि Criteria.Period मूल्य आपकी नमूना क्वेरी में से आता है।

हालांकि मुझे लगता है कि आप सभी उपलब्ध महीनों के लिए दोनों काम और समाप्ति को पढ़ने की कोशिश कर रहे हैं (और फिर आप इसे आसानी से फ़िल्टर कर सकते हैं)। यदि आपकी पहली तालिका (समाप्ति) में कुछ निर्दिष्ट महीने (मई कहें) के लिए कोई रिकॉर्ड शामिल नहीं है तो आपकी क्वेरी गलत हो सकती है। फिर select खंड को "मई" के साथ पैरामीटर के रूप में नहीं कहा जाएगा और भले ही आपके पास दूसरी तालिका (किराया का प्रतिनिधित्व करने) में कुछ डेटा था, तो आप इसे नहीं ढूंढ पाएंगे।

इसे Concat method (एमएसडीएन नमूने देखें) का उपयोग करके खूबसूरती से हल किया जा सकता है। आप माह सभी termniations और सभी नियुक्तियों (कुछ प्रकार के एक डेटा संरचना में) और फिर समूह के सभी डेटा का चयन कर सकते हैं:

var terms = from t in HRSystemDB.Terminations 
      select new { Month = t.TerminationDate.Month, 
         Year = term1.TerminationDate.Year, 
         IsHire = false }; 
var hires = from emp in HRSystemDB.Persons.OfType<Employee>() 
      select new { Month = emp.HireDate.Month, 
         Year = emp.HireDate.Year 
         IsHire = true }; 

// Now we can merge the two inputs into one 
var summary = terms.Concat(hires); 

// And group the data using month or year 
var res = from s in summary 
      group s by new { s.Year, s.Month } into g 
      select new { Period = g.Key, 
         Hires = g.Count(info => info.IsHire), 
         Terminations = g.Count(info => !info.IsHire) } 

जब अब कोड को देख, मैं बहुत यकीन है कि वहाँ कुछ छोटी रास्ता है कर रहा हूँ इसे लिखने के लिए। दूसरी ओर, यह कोड काफी पठनीय होना चाहिए, जो एक लाभ है। यह भी ध्यान रखें कि इससे कोई फर्क नहीं पड़ता कि हम कोड को दो उप-प्रश्नों में विभाजित करते हैं। LINQ से SQL के आलसी evalutation के लिए धन्यवाद, यह एक ही क्वेरी के रूप में निष्पादित किया जाना चाहिए।

+0

यह वास्तव में एक बहुत अच्छा जवाब है। मुझे कंसट विधि के बारे में पता नहीं था। मैं इसके साथ बाद में प्रयोग करूँगा और अपने परिणाम पोस्ट करूँगा। धन्यवाद। – jasonco

+0

आपने अपना जीवन बचाया। महान काम किया! मुझे इसकी ही खोज थी। धन्यवाद! +1 – jasonco

3

मुझे नहीं पता कि यह छोटा है लेकिन आप यह भी देखने के लिए इस संस्करण को आजमा सकते हैं कि यह आपके सर्वर के साथ बेहतर काम करता है या नहीं। मुझे नहीं पता कि ये दो उत्तरों एसक्यूएल स्टेटमेंट में कैसे बदलते हैं। एक आपके सूचकांक और इस तरह के आधार पर बेहतर हो सकता है।

var terms = 
    from t in Terminations 
    group t by new {t.Month, t.Year} into g 
    select new {g.Key, Count = g.Count()}; 

var hires = 
    from p in Persons 
    group p by new {p.Month, p.Year} into g 
    select new {g.Key, Count = g.Count()}; 

var summary = 
    from t in terms 
    join h in hires on t.Key equals h.Key 
    select new {t.Key.Month, t.Key.Year, 
     Hires = h.Count, Terms = t.Count}; 
+0

उत्तर के लिए धन्यवाद। यह संस्करण तब तक काम करता है जब तक कि उसी महीने में कोई समाप्ति या किराया न हो। यदि उनमें से किसी में कोई किराया या समाप्ति नहीं हुई थी तो उस विशेष महीने के लिए कोई परिणाम नहीं दिखाया जाएगा, भले ही वहां 2 किराया, लेकिन मई में 0 समाप्तिएं हों। मुझे एक छोटा सुधार करना पड़ा, समूह (मेरे विशेष मामले के लिए) होना चाहिए "समूह टी नए {t.TerminationDate.Month, t.TerminationDate.Year} में जी" और "ग्रुप पी द्वारा नए {पी। HireDate.Month, पी। HireDate.Year} जी में "। इसके अलावा मुझे लगता है कि यह एक अच्छा जवाब है। धन्यवाद! +1 :-) – jasonco

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