2014-12-12 7 views
6

मैं एक उत्पादों तालिका इस तरह है: -क्या मुझे LINQ में ऑर्डरबैडस्केंडिंग का उपयोग करना चाहिए?

ProductID  ProductName  Price 
    1   Milk   10 
    2   Banana   20 
    3   Apple   15 
    1   Grapes   12 
    2   Banana   25 
    1    Milk   8 

मैं उत्पादों जो एक productId का अधिकतम कीमत है खोजना चाहते हैं।

नमूना आउटपुट: -

ProductID  ProductName  Price 
     1   Grapes   12 
     2   Banana   25 
     3   Apple   15 

मैं इस क्वेरी की कोशिश की है: -

List<Product> groups = products 
    .GroupBy(p => p.ProductId) 
    .Select(p => new Product 
     { 
      ProductId = p.Key, 
      Name = p.OrderByDescending(o => o.Price).First().Name, 
      Price = p.OrderByDescending(o => o.Price).First().Price, 
     }) 
    .ToList(); 

इस क्वेरी ठीक काम कर रहा है, लेकिन मेरे सवाल का मैं OrderByDescending दो बार का उपयोग करना चाहिए है? मेरा मतलब है क्योंकि मैं सिर्फ 1 संपत्ति के आधार पर एक आइटम चाहता हूं और मान लीजिए कि कई अन्य गुण हैं, तो क्या मुझे बार-बार एक ही तर्क का उपयोग करने की आवश्यकता है?

संपादित करें: क्षमा करें मुझे उल्लेख करना भूल गया, कृपया मान लें कि उत्पाद नाम अलग हो सकता है, कृपया अपडेट की गई तालिकाएं जांचें।

उत्तर

5

नहीं, आप, तो आप सिर्फ First() चयन कर सकते हैं की जरूरत नहीं है:

new Product 
{ 
    ProductId = p.Key, 
    Name = p.First().Name, 
    Bar = p.First().Bar, 
    Price = p.OrderByDescending(o => o.Price).First().Price, 
} 
निश्चित रूप से

इसमें दिए गए ProductId साथ सभी उत्पादों मानता ही Name और Bar है।

यदि यह स्थिति नहीं है और आप, चयनित संस्था से सभी गुण के नक्शे में एक कोड ब्लॉक बनाना चाहते हैं अपने Select():

.Select(p => 
{ 
    var havingHighestPrice = p.OrderByDescending(o => o.Price).First() 

    return new Product 
    { 
     ProductId = p.Key, 
     Name = havingHighestPrice.Name, 
     Bar = havingHighestPrice.Bar, 
     Price = havingHighestPrice.Price, 
    } 
}) 
+1

क्या यह वही उत्पाद नाम लौटाएगा जो कीमत हम उठा रहे हैं? –

+0

@CodeCaster: उत्तर के लिए धन्यवाद, लेकिन अगर उत्पाद नाम अलग हैं तो क्या होगा? मैंने अपना प्रश्न अपडेट किया है। – Coder23

+0

@ कोडर और मैंने पहले ही अपना जवाब अपडेट कर लिया था, दूसरा कोड ब्लॉक देखें। – CodeCaster

1

आप स्थानीय चर स्टोर करने के लिए LINQ क्वेरी सिंटैक्स का उपयोग कर सकते हैं:

var groups = from p in products.GroupBy(x => x.ProductId) 
      let first = p.OrderByDescending(o => o.Price).First() 
      select new Product 
      { 
       ProductId = p.Key, 
       Name = first.Name, 
       Price = first.Price, 
      }; 

महत्वपूर्ण बात यह है कि एंटीटी फ्रेमवर्क प्रश्नों में उपयोग करना सुरक्षित है।

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