2010-10-03 11 views
14

सारांश: डेटाLINQ में किसी समूह का पहला रिकॉर्ड प्राप्त करें?

मैं एक CarId क्षेत्र से समूह के लिए कोशिश कर रहा हूँ, और फिर प्रत्येक समूह के भीतर, मैं एक DateTimeStamp क्षेत्र उतरते पर क्रमबद्ध करना चाहते हैं की आदेश दिया समूहों में शीर्ष 1 तत्व प्राप्त करने के लिए कैसे। वांछित डेटा प्रत्येक कार के लिए मुझे नवीनतम डेटटाइमस्टैम्प और समूह में केवल 1 देगा।

मैं इस बिंदु पर जा सकता हूं, लेकिन समूह के शीर्ष 1 को लेने और डेटटाइमस्टैम्प desc द्वारा समूह को ऑर्डर करने में समस्याएं आ रही हैं।

यहाँ मैं पहले समूह आपरेशन के बाद है:

group 1 
------------------------ 
CarId DateTimeStamp 
1  1/1/2010 
1  1/3/2010 
1  3/4/2010 

group 2 
------------------------ 
CarId DateTimeStamp 
2  10/1/2009 
2  1/3/2010 
2  9/4/2010 

क्या मैं केवल शीर्ष 1 की इच्छा होगी एक आदेश दिया समूह में

group 1 
    ------------------------ 
    CarId DateTimeStamp 
    1  3/4/2010 

    group 2 
    ------------------------ 
    CarId DateTimeStamp 
    2  9/4/2010 

Brickwall: कहाँ मैं रुक गया हूं, क्लॉज द्वारा समूह में कारआईडी और डेटटाइमस्टैम्प की आवश्यकता है, बाद में डेटटाइमस्टैम्प द्वारा क्रमबद्ध करने के लिए। हो सकता है कि तारीख का क्रमबद्ध एक अलग समारोह में किया जाना चाहिए, सुनिश्चित नहीं है।

उत्तर

16
data 
    .GroupBy(
     x => x.CardId, 
     (x, y) => new { 
      Key = x, 
      Value = y.OrderByDescending(z => z.DateTimeStamp).FirstOrDefault() 
     } 
    ); 

हो जाएगा ताकि समूह के सभी CardId द्वारा तत्वों, तो DateTimeStamp (उतरते) द्वारा प्रत्येक समूह के तत्वों के आदेश, फिर प्रत्येक समूह नीचे धीरे-धीरे कम करने के लिए केवल पहला तत्व होते हैं। अंत में, यह "समूह" का एक गणना करता है (डरावनी उद्धरण के साथ क्योंकि वे IGrouping के बजाय वास्तव में एक अज्ञात प्रकार हैं) जहां प्रत्येक समूह में एक आइटम होता है जिसे आप चाहते हैं।

+5

उसने ऐसा किया! मुझे अपवाद मिला और मुझे पहले() के बजाय FirstOrDefault() का उपयोग करना पड़ा। धन्यवाद! – RyBolt

+0

+1: बिल्कुल सही। बस मुझे जो चाहिए (ग्रुपिंग का एक संस्करण और पहला रिकॉर्ड मैं वास्तव में अनुसरण कर सकता हूं :) –

+0

धन्यवाद, मैं इसके लिए खोज कर रहा था, मैंने पिछले रिकॉर्ड द्वारा 'एसक्यूएल समूह' की खोज की लेकिन मुझे पिछले रिकॉर्ड द्वारा समाधान 'लिनक समूह' नहीं मिला यहां आने में मदद मिली, केवल आवश्यकता है, मुझे इसे 'व्यूमोडेल' – stom

0

इसे आजमाएं?

var latest = Group1.OrderByDescending(x=>x.DateTimeStamp).FirstOrDefault(); 
+0

कि सिर्फ पहली * समूह नहीं लौटेगा *? प्रत्येक समूह में पहली वस्तु नहीं है? –

+0

@ किर्क: हाँ, ऐसा लगता है कि ओपी उन्हें अलग समूहों में रखता है, क्योंकि प्रत्येक 'परिणामसेट' के अलग-अलग परिणाम डेटा और शीर्षलेख होते हैं। मेरे उत्तरों में 'समूह 1' है यह हाइलाइट करने के लिए कि दोनों समूहों के साथ यह कैसे किया जा सकता है। –

+0

आपका समूह 1 कैसे परिभाषित किया गया है, क्या इसमें आईडी और डेटटाइमस्टैम्प है? – RyBolt

2

मैं क्वेरी अभिव्यक्ति वाक्य रचना आसान लगता है अपने आप को समझने के लिए:

from x in data 
group x by x.CarId into grp 
select new { 
    CarId = x.CarId, 
    Record = (from x in grp orderby z.DateTimeStamp descending).FirstOrDefault() 
}; 
संबंधित मुद्दे