2016-07-11 13 views
5

मैं आईडी, ContactId साथ निम्नलिखित सरल तालिका है में पिछले रिकॉर्ड को चुनने के लिए और टिप्पणीकैसे एक LINQ GroupBy खंड

enter image description here

मैं रिकॉर्ड और GroupBy contactId चयन करना चाहते हैं।

Mains.GroupBy(l => l.ContactID) 
.Select(g => g.FirstOrDefault()) 
.ToList() 

यह रिकॉर्ड 1 और 4 रिटर्न: मैं इस LINQ विस्तार विधि बयान का इस्तेमाल किया। मैं LINQ कैसे उपयोग कर सकते हैं उच्चतम ID साथ ContactID पाने के लिए? (यानी 3 लौट सकते हैं और 6)

उत्तर

11

आप समूह में वस्तुओं पर आप

आइटम
Mains.GroupBy(l => l.ContactID) 
.Select(g=>g.OrderByDescending(c=>c.ID).FirstOrDefault()) 
.ToList() 
5

उपयोग OrderByDescending आदेश कर सकते हैं:

Mains.GroupBy(l => l.ContactID) 
    .Select(g => g.OrderByDescending(l => l.ID).First()) 
    .ToList(); 

इसके अलावा, FirstOrDefault की कोई आवश्यकता नहीं है जब एक का चयन नहीं है समूह से आइटम; ताकि आप First() सुरक्षित रूप से उपयोग कर सकते हैं एक समूह हमेशा कम से कम एक आइटम होगा।

1

OrderByDescending

Mains.GroupBy(l => l.ContactID) 
.Select(g=>g.OrderByDescending(c=>c.ID).FirstOrDefault()) 
.ToList() 

अपने सबसे अच्छे समाधान

यह उच्चतम आईडी उतरते है, जो नाम से बहुत स्पष्ट है के द्वारा आदेश है।

3

शायद MaxOrderByDescending के बजाय साथ चयन प्रदर्शन के बेहतर बनाने में परिणाम सकता है (मुझे यकीन है कि नहीं कर रहा हूँ तो यह परीक्षण किया जाना चाहिए कि यह कैसे अंदर बना है):

var grouped = Mains.GroupBy(l => l.ContactID); 
var ids = grouped.Select(g => g.Max(x => x.Id)); 
var result = grouped.Where(g => ids.Contains(g.Id)); 

मुझे लगता है के रूप में यह हो सकता है एक प्रश्न है कि MAX ले जाएगा और उसके बाद SELECT * FROM ... WHERE id IN ({max ids here}) जो OrderByDescending की तुलना में काफी तेजी से हो सकता है कर में। अगर मैं सही नहीं हूँ

मुझे सही करने के लिए स्वतंत्र महसूस।

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