2016-06-21 43 views
5

problemu jest po uruchomieniuWłączanie IEnumerable z IEnumerables do słownika

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

Temp sumy jest IEnumerable, który zawiera IEnumerable prostego klasy

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

Chodzi o to, aby następnie podjąć te dane i pogrupuj je w słownik, aby uzyskać w sumie wszystkie kwoty z kluczem będącym typem.

Efekt końcowy powinien wyglądać następująco:

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

wiem, że mogę po prostu foreach go jednak szukam rozwiązania przy użyciu LINQ.

Odpowiedz

7

Spróbuj tego:

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

Ponieważ rodzaj Amount jest decimal? wówczas wartość Słownik jest również decimal?.

+0

Narzeka, ponieważ "Element z tym samym kluczem został już dodany." –

+0

@BenJones - Sprawdź kod, ponieważ zmieniłem go w ciągu pierwszych pięciu minut. Kod, który mam teraz, nie może mieć tego błędu. – Enigmativity

+0

Tak, to działa Dziękuję :) –

1

Spróbuj tego:

IEnumerable<IEnumerable<TempTotals>> yourCollection; 

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

Gdzie dictionary będzie Dictionary<string, decimal>. Ale musisz mieć pewność, że nie będziesz mieć dwóch TempTotals z tym samym Type.

+0

To nie grupuje się na 'Type', więc jeśli jest więcej niż jeden przedmiot tego samego typu, rzuci wyjątek. – juharr