2012-11-15 21 views
5

topluluğundan dize olarak iki özelliğe sahip olsun. Anonim bir seçim için bir linq sorgusu içinde, iki özellikten dizeleri birleştirmek istiyorum. Örneğin, bazı kişilerin gruplandırılmasında en eski kişinin tam adını bulmak için. Linq Lambda,

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) 
      }); 

Ben firstname ve boşluk sonra Soyad almak için tekrar tam toplamını yazmak zorunda mı?

+0

her sonuç tam çıkmak ister misin en eski kişinin adı, ya da sadece en eski kişinin "FullnameOfOldes" adlı olmasını ister misiniz? – davisoa

cevap

1

olarak bunu yapabilirsiniz: Yeni aralık değişkenleri tanıtmak let kullanabilirsiniz

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

Sen seç bir lambda deyimi kullanabilirsiniz

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
  • . o
  • Ben
  • Ben en yaşlı kişi inanıyoruz OrderBy en eski kişiyi bulacaksınız (ama performans agrega kullanabilir ve karşılaştırabilirsiniz) düşünmek atanan özelliğin adını eşitse
  • Anonim türü için özellik adını belirtmek gerekmez minimal doğum tarihi ile biridir, bu nedenle pers1.BirthDate < pers2.BirthDate ? pers1 : pers2

için toplanmasına değiştirmeniz gerekir Yani

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

Huh, üçüncü mermi okuyana kadar bunu düşünmemiştim, fakat 'Agrega' bu kullanımı MoreLINQ'ın "MaxBy" veya "O (n log n)' 'OrderBy 'ye uygun bir alternatif gibi görünüyor ...) .İlk() '. – Rawling

+1

@Rawling, 'morelinq' için çok teşekkür ederim! Uygulamalarına bir göz atmak çok ilginç –