2016-06-21 15 views
5

Vấn đề là sau khi chạyBiến một IEnumerable của IEnumerables thành một cuốn từ điển

reportData = dbContext.FinancialsBySupplierAuditPeriodStatusType 
         .Where(v => v.ReviewPeriodID == reportFilter.ReviewPeriodID && v.StatusCategoryID == reportFilter.StatusCategoryID) 
         .GroupBy(s => new { s.SupplierID }) 

         .Select(g => new DrilldownReportItem { 
          SupplierID = g.Key.SupplierID, 
          SupplierName = g.Max(v => v.SupplierName), 
          AccountNo = g.Max(v => v.AccountNo), 
          TempTotals = g.Select(v => new TempTotals { ClaimType = v.TypeDesc ?? "Old Claims", Amount = v.Amount }) 
         }).OrderBy(r => r.SupplierName).ToList(); 

tổng số Temp là một IEnumerable có chứa một IEnumerable của một lớp đơn giản của

public class TempTotals { 
    public string Type { get; set; } 
    public decimal? Amount { get; set; } 
} 

Ý tưởng là để sau đó đi dữ liệu này và nhóm nó vào một từ điển để tôi có thể nhận được tổng số tất cả các số tiền với khóa là loại.

Kết quả cuối cùng sẽ giống như thế:

Dictionary<string, decimal> test = new Dictionary<string, decimal>() { 
       {"Claim",2 }, 
       {"Query", 500 }, 
       {"Normal", 700 } 
      }; 

tôi biết rằng tôi chỉ có thể foreach nó tuy nhiên tôi đang tìm kiếm một giải pháp sử dụng LINQ.

Trả lời

7

Hãy thử điều này:

Dictionary<string, decimal?> test = 
    reportData 
     .SelectMany(rd => rd.TempTotals) 
     .GroupBy(tt => tt.ClaimType, tt => tt.Amount) 
     .ToDictionary(g => g.Key, g => g.Sum()); 

Kể từ khi loại Amountdecimal? thì giá trị điển cũng là decimal?.

+0

Nó than phiền vì "Một mục có cùng khóa đã được thêm." –

+0

@BenJones - Kiểm tra mã vì tôi đã thay đổi mã này trong năm phút đầu tiên. Mã tôi đã có bây giờ không thể có lỗi đó. – Enigmativity

+0

Vâng, hoạt động Cảm ơn bạn :) –

1

Hãy thử điều này:

IEnumerable<IEnumerable<TempTotals>> yourCollection; 

var dictionary = yourCollection.SelectMany(s => s).ToDictionary(k => k.Type, v => v.Amount); 

đâu dictionary sẽ Dictionary<string, decimal>. Nhưng bạn cần phải chắc chắn rằng bạn sẽ không có hai số TempTotals với cùng một số Type.

+0

Điều đó không nhóm trên 'Loại', vì vậy nếu có nhiều mục cùng loại, nó sẽ ném một ngoại lệ. – juharr

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