2012-04-05 17 views
8

मैं डेटा संरचनानवीनतम चयन करने के लिए Linq रिकॉर्ड

enter image description here

प्रत्येक आइटम के लिए वहाँ है कीमत प्रत्येक मुद्रा में एक निश्चित तिथि पर इसका कोई रिकॉर्ड है। मुझे एक ऐसी क्वेरी बनाने की ज़रूरत है जो प्रत्येक मुद्रा के लिए सबसे अधिक मौजूदा मूल्य लौटाए।

यह क्वेरी काम करती है, लेकिन मुद्रा आईडी 1 के लिए एकाधिक Amounts लौटाती है। इसे केवल 3 रिकॉर्ड, 7,8 and 9 वापस करना चाहिए क्योंकि ये इस आइटम के लिए सभी मुद्राओं में सबसे अद्यतित कीमतों का प्रतिनिधित्व करते हैं।

var q = (from c in db.tblStoreItemPrices where c.ItemID == ID select new { c.CurrencyID, c.Amount }); 

कृपया सभी ऑर्डरिंग को अनदेखा करें और मान लें कि रिकॉर्ड यादृच्छिक रूप से आदेश दिए गए हैं।

किसी भी मदद के लिए धन्यवाद!

+0

से आप चाहते हैं "लगता है कि रिकॉर्ड बेतरतीब ढंग से आदेश दिया जाता है" इसे और अधिक समझ में नहीं कर सकते हैं क्रम अकेले प्रदर्शन के लिए इस random'ness कम करने के लिए एक संकुल प्राथमिक कुंजी के अलावा अन्य सूचकांक है। – KingCronus

उत्तर

27

यह काम करना चाहिए:

db.tblStoreItemPrices 
    .Where(c => c.ItemID == ID) 
    .GroupBy(c => c.CurrencyID) 
    .Select(g => g.OrderByDescending(c => c.Date).First()) 
    .Select(c => new { c.CurrencyID, c.Amount }); 

स्पष्टीकरण: विशिष्ट ItemID

  • समूह के लिए

    1. पंक्तियों प्रत्येक मुद्रा समूह के अंतर्गत CurrencyID
    2. द्वारा चयन पंक्ति है कि सबसे अधिक है का चयन हालिया तारीख (परिणाम सेट में प्रत्येक मुद्रा आईडी के लिए एक पंक्ति छोड़कर)
    3. वें बाहर खींचें ई जानकारी इन पंक्तियों
  • +1

    धन्यवाद - यह एक बहुत बड़ी मदद थी। एएसपी.नेट एमवीसी 5 में यह पहली बार समस्या थी - फर्स्टऑर्ड डीफॉल्ट में बदलकर यह बहुत अच्छा काम कर रहा था। धन्यवाद फिर से :) – Tunerx

    +0

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

    +0

    लेकिन कॉलम तिथि को पहले ही अनुक्रमित किया गया है तो यह ठीक है –

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