2016-01-27 9 views
0

我一直在這一整天都在苦苦掙扎。如何在我的IQueryable類上使用SelectMany?

所以我的課看起來如下:

public class SupplierSummaryReport { 
    public string SupplierName { get; set; } 
    public decimal TurnOverValues { get; set; } 
} 

的LINQ到目前爲止是這樣的:

var data = (from i in _ctx.Invoices 
         where i.Turnover == true 
         where last5Years.Contains(i.InvoiceDate.Year) 
         select new { 
          Year = i.InvoiceDate.Year, 
          AccountName = i.AccountName, 
          Value = i.NetAmount_Home ?? 0 
         }); 

      var y = data.GroupBy(r => new { r.Year, r.AccountName }) 
       .Select(g => new APData.Audit.Models.ReportModels.SupplierSummaryReport { 
        SupplierName = g.Key.AccountName, 
        TurnOverValues = new List<decimal>{ 
        g.Sum(r => r.Value) 
        } 
       }); 

這讓我看起來像這樣的數據:

{2014, "Test Supplier", 1}, {2012, "Test Supplier", 2}, {2015, "Test Supplier two", 5}, {2011, "Test Supplier two", 9} 

我需要使用.SelectMany來選擇SupplierNameTurnOverValues。不過,我需要把這些值轉換成一個類的單獨列表類似如下:

public class SupplierSummaryData { 
    public string SupplierName { get; set; } 
    public List<decimal> Values { get; set; } 
} 

我一直在尋找使用LINQ,但我一直沒能做到這一點迄今。我明白這個問題是非常具體的,但我沒有其他的轉向,如果你需要更多的信息,請留下評論。

預期輸出:

{"Test Supplier", {2,5}}, {"Test Supplier two", {5,6}} 
+0

'SupplierSummaryData'不包含一年。這是否意味着你不想在一年之前分組?你能展示一個預期產出的例子嗎? –

+0

@YacoubMassad嗨,我現在不需要一年,不需要。檢查預期結果的編輯 –

+0

在你的例子中,你將'SupplierSummaryReport.TurnOverValues'指定爲'List',然後將其定義爲'decimal' - 無法編譯(我認爲它只是一個複製/粘貼錯誤?) – Jamiec

回答

5

您只,然後AccountName爲每個組選擇供應商名稱和值這樣的列表需要組:

var result = 
    data.GroupBy(r => r.AccountName) 
    .Select(g => new APData.Audit.Models.ReportModels.SupplierSummaryReport 
    { 
     SupplierName = g.Key, 
     TurnOverValues = g.Select(r => r.Value).ToList() 
    }); 
+0

這是一個非常有效的一點。但是,由於海量數據,我收到OutOfMemoryException。好吧。另一個問題。謝謝! –