2016-06-21 106 views
5

Il problema è dopo l'esecuzioneGirando un IEnumerable di IEnumerables in un dizionario

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

totali Temp è un IEnumerable che contiene un IEnumerable di una semplice classe di

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

L'idea è di quindi prendere questi dati e raggrupparli in un dizionario in modo da poter ottenere un totale di tutti gli importi con la chiave come tipo.

Il risultato finale dovrebbe essere simile:

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

So che ho potuto solo foreach è comunque sto cercando una soluzione utilizzando LINQ.

risposta

7

Prova questo:

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

Dal momento che il tipo di Amount è decimal? allora il valore dizionario è anche decimal?.

+0

Si lamenta perché "Un elemento con la stessa chiave è già stato aggiunto." –

+0

@BenJones - Controlla il codice perché l'ho cambiato nei primi cinque minuti. Il codice che ho ora non può avere quell'errore. – Enigmativity

+0

Sì, questo funziona Grazie :) –

1

Prova questa:

IEnumerable<IEnumerable<TempTotals>> yourCollection; 

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

Dove dictionary sarà Dictionary<string, decimal>. Ma devi essere sicuro di non avere due TempTotals con lo stesso Type.

+0

Questo non raggruppa in "Tipo", quindi se c'è più di un elemento con lo stesso tipo, genererà un'eccezione. – juharr