2012-11-15 36 views
5

किसी अज्ञात चयन के लिए एक linq क्वेरी के अंदर मैं दो गुणों से स्ट्रिंग को जोड़ना चाहता हूं।लिंकक लैम्ब्डा को दो गुणों को स्ट्रिंग के रूप में स्ट्रिंग के रूप में मिलता है

उदाहरण के लिए व्यक्तियों के कुछ समूह में सबसे पुराने व्यक्ति का पूरा नाम ढूंढना।

var personsAndOldest = db.Persons.GroupBy(person => person.SomeThingThatCanBeGroupedForPerson).Select(a => new 
      { 
       FirstName = a.FirstOrDefault().FirstName, 
       LastName = a.FirstOrDefault().LastName, 
       BirthDate = a.FirstOrDefault().BirthDate, 
       FullnameOfOldes = a.Aggregate((pers1, pers2) => pers1.BirthDate > pers2.BirthDate ? pers1 : pers2).FirstName + " " //How do I get LastName of the old one (without using the full aggregate again) 
      }); 

क्या मुझे प्रथम नाम और व्हाइटस्पेस के बाद अंतिम नाम प्राप्त करने के लिए फिर से पूर्ण एकत्रीकरण लिखना है?

+0

आप हर परिणाम पूर्ण करना चाहते हैं सबसे पुराने व्यक्ति का नाम, या क्या आप चाहते हैं कि सबसे पुराना व्यक्ति 'FullnameOfOldes' जनसंख्या वाला हो? – davisoa

उत्तर

1

ऐसा कर सकते हैं:

var personsAndOldest = db.Persons.GroupBy(person => person.SomeThingThatCanBeGroupedForPerson).Select(a => 
    { 
     var first = a.First(); 
     var oldest = a.Aggregate((pers1, pers2) => pers1.BirthDate > pers2.BirthDate ? pers1 : pers2); 
     return new 
     { 
      FirstName = first.FirstName, 
      LastName = first.LastName, 
      BirthDate = first.BirthDate, 
      FullnameOfOldes = oldest.FirstName + " " + oldest.LastName) 
     }; 
    }); 
1

आप आप चयन में एक लैम्ब्डा बयान इस्तेमाल कर सकते हैं के रूप में

var personsAndOldest = db.Persons 
    .GroupBy(person => person.SomeThingThatCanBeGroupedForPerson) 
    .Select(g => new 
     { 
      a = g.First(), 
      o = g.Aggregate((pers1, pers2) => 
       pers1.BirthDate > pers2.BirthDate ? pers1 : pers2) 
     }) 
    .Select(pair => new 
     { 
      FirstName = pair.a.FirstName, 
      LastName = pair.a.LastName, 
      BirthDate = pair.a.BirthDate, 
      FullnameOfOldes = pair.o.FirstName + " " + pair.o.LastName 
     }); 
0
  • आप let उपयोग कर सकते हैं नई रेंज चर लागू करने के लिए।
  • आप अगर यह सौंपा संपत्ति
  • मुझे लगता है कि OrderBy सबसे पुराना व्यक्ति मिलेगा (लेकिन आप कुल का उपयोग करें और प्रदर्शन की तुलना कर सकते हैं)
  • मुझे लगता है कि सबसे पुराना व्यक्ति को विश्वास के नाम के बराबर होती है गुमनाम प्रकार के लिए संपत्ति नाम निर्दिष्ट करने की जरूरत नहीं है कम से कम जन्म तिथि के साथ एक है, इसलिए आप pers1.BirthDate < pers2.BirthDate ? pers1 : pers2

के एकत्रीकरण को बदलने की जरूरत तो

var personsAndOldest = from p in db.Persons 
         group p by p.SomeThingThatCanBeGroupedForPerson into g 
         let first = g.FirtOrDefault() 
         let oldest = g.OrderBy(x => x.BirthDate).FirstOrefault() 
         select 
         { 
          first.FirstName, 
          first.LastName, 
          first.BirthDate, 
          FullnameOfOldes = oldest.FirstName + " " + oldest.LastName 
         }; 
+1

हू, मैंने तब तक इसके बारे में सोचा नहीं जब तक कि मैं आपकी तीसरी गोली नहीं पढ़ता, लेकिन 'कुल' का यह उपयोग मोरिलक्यू के 'मैक्सबी' या 'ओ (एन लॉग एन)' ऑर्डरबी (...) के व्यवहार्य विकल्प की तरह दिखता है।) प्रथम() '। – Rawling

+1

@ रावलिंग 'morelinq' का उल्लेख करने के लिए बहुत बहुत धन्यवाद! उनके कार्यान्वयन पर नजर डालना बहुत दिलचस्प है –