2009-07-21 47 views
7

Tôi có một danh sách các hồ sơ với cơ cấu như sau: (! Ví dụ đơn giản)Nhóm đa cấp trong LINQ?

class Rate 
{ 
    string Code; 
    double InterestFrom; 
    double InterestTo; 
    double IncomeFrom; 
    double IncomeTo; 
    double Value; 
} 

Và vâng, tôi có một danh sách <Rate> xác định. Tôi cần phải chuyển đổi danh sách này như sau đơn giản hóa cấu trúc:

class RateList 
{ 
    List<Code> code; 
} 
class Code 
{ 
    string code; 
    List<Interest> interest; 
} 
class Interest 
{ 
    double InterestFrom; 
    double InterestTo; 
    List<Income> income; 
} 
class Income 
{ 
    double IncomeFrom; 
    double IncomeTo; 
    double Value; 
} 

Và tôi muốn làm điều này với một truy vấn LINQ duy nhất. Tôi có thể làm việc ra các giải pháp khác nhưng thách thức là làm điều đó trong một câu lệnh LINQ. Về cơ bản, nhóm cấp cao nhất được nhóm theo mã. Cấp độ tiếp theo của các giá trị InterestFrom và InterestTo và mức thấp nhất là danh sách IncomeFrom, IncomeTo và Value.

Vì vậy, câu lệnh LINQ là gì?

+0

Bạn có thể cung cấp một danh sách các giá đầu vào và đầu ra mong muốn? –

+0

Đầu ra mong muốn là một đối tượng duy nhất của loại RateList. InterestFrom/InterestTo và IncomeFrom/IncomeTo là các giá trị lặp lại cho mỗi mã. Một bản ghi ví dụ sẽ là: ("AB", 0, 6, 10000, 20000, 40.3) hoặc ("AB", 6, 7.5, 10000, 20000, 40.3). –

+0

Bạn đề cập đến "mức thấp nhất được nhóm theo IncomeFrom và IncomeTo." - Nếu đây là trường hợp, 'Giá trị' sẽ được tổng kết? Hay bạn không thực sự có nghĩa là nhóm các giá trị đó? (dừng lại ở sở thích) –

Trả lời

18

này là khá lớn, nhưng đây là những gì tôi có:

var rateList = new RateList 
       { 
        code = (from r in rates 
          group r by r.Code into g 
          select new Code 
          { 
           code = g.Key, 
           interest = (from i in g 
              group i by new {i.InterestFrom, i.InterestTo} into g2 
              select new Interest 
              { 
               InterestFrom = g2.Key.InterestFrom, 
               InterestTo = g2.Key.InterestTo, 
               income = (from inc in g2 
                 select new Income 
                 { 
                  IncomeFrom = inc.IncomeFrom, 
                  IncomeTo = inc.IncomeTo, 
                  Value = inc.Value 
                 }).ToList() 
              }).ToList() 
          }).ToList() 
       }; 
+0

Rất lớn là không có vấn đề gì. :-) Chỉ muốn biết nếu nó có thể được thực hiện trong một tuyên bố duy nhất. (Và sau đó kiểm tra xem nó có thể đọc được không ...) –

+0

Đây là cách ngắn gọn nhất mà tôi có thể nghĩ để làm ngay bây giờ. Cách tốt nhất tôi biết để bạn rút ngắn nó là có một số nhà xây dựng đơn giản trên các lớp đó. Nó sẽ không cắt quá nhiều, nhưng nó sẽ giúp ích một chút. –

+0

Và kiểm tra mã! Nó hoạt động! Đó là một tuyên bố quái vật nhưng sau đó một lần nữa, tôi muốn ngăn cản các nhà phát triển ít kinh nghiệm từ sửa đổi nó. Và thành thật mà nói, nó vẫn rất dễ đọc. –