LINQ में उच्चतम तिथि वाले केवल रिकॉर्ड का चयन कैसे करें


117

मेरे पास एक टेबल है, 'लास्ट एंट्रीज', जिसके नीचे के क्षेत्र हैं।

Id, AccountId, Version, DownloadNo, Date

डेटा इस तरह दिखता है:

28092|15240000|1.0.7.1782|2009040004731|2009-01-20 13:10:22.000
28094|61615000|1.0.7.1782|2009040007696|2009-01-20 13:11:38.000
28095|95317000|1.0.7.1782|2009040007695|2009-01-20 13:10:18.000
28101|15240000|1.0.7.1782|2009040004740|2009-01-20 14:10:22.000
28103|61615000|1.0.7.1782|2009040007690|2009-01-20 14:11:38.000
28104|95317000|1.0.7.1782|2009040007710|2009-01-20 14:10:18.000

मैं LINQ से SQL में कैसे कर सकते हैं , केवल हर AccountId (उच्चतम तिथि के साथ एक) के अंतिम lasttrace मिलता है?


वास्तव में आपके उदाहरण में सभी एक ही खाता आईडी के साथ लॉग करते हैं, एक ही तारीख है, तो उस मामले में कौन वरीयता लेता है?
ब्लैकटाइगरएक्स

जवाबों:


230

यदि आप प्रत्येक खाते की अंतिम तिथि चाहते हैं, तो आप इसका उपयोग करेंगे:

var q = from n in table
        group n by n.AccountId into g
        select new {AccountId = g.Key, Date = g.Max(t=>t.Date)};

यदि आप पूरा रिकॉर्ड चाहते हैं:

var q = from n in table
        group n by n.AccountId into g
        select g.OrderByDescending(t=>t.Date).FirstOrDefault();

2
ओरेकल इस का समर्थन नहीं करता है। यदि क्वेरी प्रदर्शन आपके विचार से बाहर है, तो आप क्वेरी करने से पहले तालिका ToList में परिवर्तित कर सकते हैं।
विल

8
यह बहुत अच्छा होगा यदि आप इसके method-chainलिए कोई समाधान पोस्ट कर सकते हैं ।
LCJ

दूसरी क्वेरी - यह नहीं होना चाहिए (from n in table ...).First()?
जेसन एल

@ जेसन, नहीं। First()कॉल करने के लिए आवेदन करना चाहिए g.Order...अभिव्यक्ति (सबक्वेरी)।
मेहरदाद अफश्री

1
@ मेहरदाद अफश्री ने कमाल किया , मैं मुख्य रूप से दूसरा चाहती थी लेकिन वे दोनों अब मेरे स्निपेट्स में बहुत उपयोगी हैं । धन्यवाद धन्यवाद धन्यवाद!!!!!
एंड्रयू डे

52

यहाँ यह करने के लिए एक सरल तरीका है

var lastPlayerControlCommand = this.ObjectContext.PlayerControlCommands
                                .Where(c => c.PlayerID == player.ID)
                                .OrderByDescending(t=>t.CreationTime)
                                .FirstOrDefault();

इसके अलावा इस शानदार LINQ जगह पर एक नजर डालें - LINQ to SQL नमूने


25
यह समाधान ठीक काम करता है यदि आप प्रति खाता क्वेरी कर रहे थे, लेकिन ऐसा नहीं करते हैं, जो ओपी ने कहा है, जो एक खाता विवरण प्रदान किए बिना सभी रिकॉर्ड के लिए सबसे हालिया परिणाम प्राप्त करना है (आपके मामले में PlayerId)
Maciej

1
इस समाधान ने मुझे अधिकतम का चयन करने के बजाय ऑर्डर करने के लिए प्रेरित किया। +1
रज़वान डुमित्रु

इस समाधान से "Sequence में कोई तत्व नहीं होता है" Linq में त्रुटि हो सकती है?
xSkrappy

34

यदि आप पूरा रिकॉर्ड चाहते हैं, तो यहाँ एक लंबा रास्ता तय किया गया है:

var q = _context
             .lasttraces
             .GroupBy(s => s.AccountId)
             .Select(s => s.OrderByDescending(x => x.Date).FirstOrDefault());

1
महान काम किया। धन्यवाद।
टेरी

यह यहाँ की कुंजी है।
जेसन पी सॉलिंगर


3

यह करने के लिए एक सरल तरीका जाओ: -

निम्नलिखित जानकारी रखने के लिए एक वर्ग बनाया गया

  • स्तर (संख्या)
  • Url (साइट का यूआरएल)

ArrayList ऑब्जेक्ट पर संग्रहीत साइटों की सूची पर जाएं। और निम्न क्वेरी को स्तर द्वारा अवरोही क्रम में क्रमबद्ध करने के लिए निष्पादित किया गया।

var query = from MyClass object in objCollection 
    orderby object.Level descending 
    select object

एक बार जब मैंने संग्रह को अवरोही क्रम में क्रमबद्ध कर लिया, तो मैंने शीर्ष पंक्ति के रूप में आने वाली वस्तु को पाने के लिए निम्नलिखित कोड लिखा

MyClass topObject = query.FirstRow<MyClass>()

इसने आकर्षण की तरह काम किया।


इसने मुझे मेरे मूल विचार से बेहतर विचार दिया। धन्यवाद!
पॉलज
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.