2009-11-10 14 views
27

ऑब्जेक्ट प्राप्त करने के लिए उपयोग की जाने वाली SQL सर्वर तालिका पर विचार करें।LINQ से SQL: GroupBy() और Max() को नवीनतम दिनांक

प्रत्येक कस्टिड के लिए केवल नवीनतम प्रविष्टि प्राप्त करने की आवश्यकता है। हम पूरी वस्तु/पंक्ति प्राप्त करना चाहते हैं। मुझे लगता है कि क्वेरी में ग्रुपबी() की आवश्यकता होगी। क्वेरी अब तक बताया गया है:

var custsLastAccess = db.CustAccesses 
         .Where(c.AccessReason.Length>0) 
         .GroupBy(c => c.CustID) 
//      .Select() 
         .ToList(); 
// (?) where to put the c.Max(cu=>cu.AccessDate) 

Custs Layout

प्रश्न: मैं नवीनतम (अधिकतम AccessDate) रिकॉर्ड/प्रत्येक CustID के लिए वस्तु का चयन करने के लिए क्वेरी कैसे बना सकते हैं?

उत्तर

26

मैं अगर कुछ की तरह सोच रहा हूँ:

var custsLastAccess = db.CustAccesses 
        .Where(c.AccessReason.Length>0) 
        .GroupBy(c => c.CustID) 
        .Select(grp => new { 
         grp.Key, 
         LastAccess = grp.OrderByDescending(
          x => x.AccessDate).FirstOrDefault() 
        }).ToList(); 

आप भी LINQ वाक्य रचना है, जो मुझे लगता है कि लग रहा है का उपयोग करते हुए OrderBy() और Last()

0
var custsLastAccess = db.CustAccesses 
          .Where(c.AccessReason.Length>0) 
         .GroupBy(c => c.CustID, (id, custs) => new { ID=id, LastAccess=custs.OrderByDescending(c=>c.AccessDate).First().AccessDate}) 
         .Select() 
         .ToList(); 
18

की कोशिश कर सकते क्लीनर:

var custsLastAccess = from c in db.CustAccesses 
         group c by c.CustID into grp 
         select grp.OrderByDescending(c => c.AccessDate).FirstOrDefault(); 
3

यहां: यह ऑर्डरबीडडेस्क की बजाय अधिकतम उपयोग करता है, इसलिए अधिक कुशल होना चाहिए।

var subquery = from c in CustAccesses 
      group c by c.CustID into g 
      select new 
      { 
       CustID = g.Key, 
       AccessDate = g.Max(a => a.AccessDate) 
      }; 
var query = from c in CustAccesses 
      join s in subquery 
       on c.CustID equals s.CustID 
      where c.AccessDate == s.AccessDate 
      && !string.IsNullOrEmpty(c.AccessReason) 
      select c; 
+1

पता है कि इस संबंध को तोड़ दिया नहीं होगा हो - यदि एक ही ग्राहक आईडी और एक ही accessdate साथ दो पंक्तियों रहे हैं, वे दोनों में शामिल होने में पाया जाएगा, और आप एक से अधिक "हाल ही में पहुंच के साथ खत्म हो सकता है "प्रति ग्राहक आईडी। –