2011-02-16 11 views
5

के साथ प्रत्येक समूह से विशिष्ट आइटम का चयन करें ऐसा करने के लिए एक-लाइनर होना चाहिए, और मुझे बस यह नहीं मिल रहा है।समूह आइटम और LINQ

इस क्वेरी को देखते हुए:

from x in new XPQuery<XPContent>(s) 
select new { x.Category, x.ContentType, x.Name, x.ContentID, x.Date } 

मैं प्रत्येक विशिष्ट कन्टैंट के लिए सबसे बड़ा तारीख के साथ रिकॉर्ड का चयन करने की जरूरत है। क्या यह LINQ के साथ चालाकी से किया जा सकता है? अभी मैं यह कर रहा हूं:

var q = (from x in new XPQuery<XPContent>(s) 
      select new { x.Category, x.ContentType, x.Name, x.ContentID, x.Date }).ToList(); 

var r = q.ToLookup(item => item.ContentID); 
foreach (var rItem in r) { 
    var s = rItem.OrderByDescending(a => a.Date).First(); 
    /* do stuff with s */ 
} 

... लेकिन ToLookup तरह का घबराहट महसूस करता है। या मेरे पास सबसे अच्छा (सरलतम) समाधान है?

इसके अलावा, मुझे पता है कि मुझे ToList का उपयोग नहीं करना चाहिए, लेकिन कृपया उस समय के लिए केवल अनदेखा करें।

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

उत्तर

6

मुझे लगता है कि आप चाहते हैं:

var q = from x in new XPQuery<XPContent>(s) 
     group x by x.ContentID into g 
     let latest = g.OrderByDescending(a => a.Date).First() 
     select new 
     { 
      latest.Category, latest.ContentType, 
      latest.Name, latest.ContentID, latest.Date 
     }; 

(। टिप्पणी वहाँ यह पहली छँटाई, एक MaxBy ऑपरेटर के साथ उदाहरण के लिए की तुलना में एक समूह से 'अधिकतम' तत्व को खोजने का अधिक performant तरीके हैं कि क्या)

क्वेरी काफी सरल है; यह सिर्फ ContentId द्वारा आइटमों को समूहित करता है, और फिर प्रत्येक समूह से, समूह के नवीनतम आइटम से उत्पन्न अज्ञात प्रकार का एक उदाहरण चुनता है।

+2

'चलो' के बारे में कभी नहीं पता था - धन्यवाद! –

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