2012-11-15 29 views
5

Bên trong truy vấn LINQ cho một lựa chọn ẩn danh Tôi muốn nối các chuỗi từ hai thuộc tính.LINQ Lambda nhận được hai thuộc tính dưới dạng chuỗi từ sự tăng tiết

Ví dụ: để tìm tên đầy đủ của người lớn tuổi nhất trong một số nhóm người.

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

Tôi có phải viết toàn bộ lần nữa để lấy LastName sau tên và khoảng trắng không?

+0

bạn có muốn kết quả hết sức để có đầy đủ tên của người lớn tuổi nhất, hoặc bạn chỉ muốn người già nhất có 'FullnameOfOldes' cư trú? – davisoa

Trả lời

1

Bạn có thể sử dụng một tuyên bố lambda trong Select:

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

Bạn có thể làm điều này như

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
  • Bạn có thể sử dụng để giới thiệu let biến dòng sản phẩm mới.
  • Bạn không cần phải xác định tên thuộc tính cho loại vô danh nếu nó tương đương với tên của tài sản giao
  • Tôi nghĩ OrderBy sẽ tìm thấy người cao tuổi nhất (nhưng bạn có thể sử dụng tổng hợp và so sánh hiệu suất)
  • Tôi tin rằng người cao tuổi nhất là một với ngày tháng năm sinh tối thiểu, vì vậy bạn cần phải thay đổi tập hợp để pers1.BirthDate < pers2.BirthDate ? pers1 : pers2

vì vậy

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, tôi không nghĩ về nó cho đến khi tôi đọc viên đạn thứ ba của bạn, nhưng việc sử dụng 'Tổng hợp' này trông giống như một sự thay thế khả thi cho' MaxBy' của MoreLINQ hoặc 'O (n log n)' 'OrderBy (...) .Đầu tiên() '. – Rawling

+1

@Rawling cảm ơn rất nhiều vì đã đề cập đến 'morelinq'! Nó rất thú vị để có một cái nhìn về triển khai của họ –

Các vấn đề liên quan