2012-11-18 95 views
0

保持查看下面的代碼,我想通過客戶ID總結/將查詢結果分組在客戶ID列旁邊的銷售和收據列。GroupBy和選擇語法選項

var sales = from s in context.Sales 
      select new { id = s.CustomerID, sales = s.Amount, receipts = (decimal)0 }; 

var receipts = from r in context.Receipts 
      select new { id = r.CustomerID, sales = (decimal)0, receipts = r.Amount }; 

var summary = sales.Union(receipts).ToList(); 

我試着使用一些組合來實現相同的:

var summary = sales.Union(receipts).GroupBy(e=>e.id).Select(...) 

...但無濟於事。

期待獲得正確的相關語法。

+0

'var summary = sales.Union(receipts).GroupBy(e => e.id).Select(g => new {g。.....});'' 爲什麼我不能在IGrouping的成員列表中獲取查詢列,「g」參數?如果我做錯了什麼? –

回答

0

你已經接近了,雖然我們不得不猜測包含了什麼Select(...)。你可以這樣做:

summary 
    .GroupBy(s => s.id) 
    .Select(g => new { id = g.Key, 
         salesSum = g.Sum(x => x.sales), 
         receiptsSum = g.Sum(x => x.receipts) 
        }) 
+0

中更新太棒了!謝謝。 –

0

試試這個

var salesAndreceipts = from data in context.Receipts 
           join data2 in context.Receipts on data.CustomerID on data2.CustomerID 
           select new { id = r.CustomerID, sales = data.Sales, receipts = data2.Amount }; 

更新代替上述的 ,試圖從銷售和收據獲取數據後,下方:

 var salesAndReceipts = sales.Union(receipts).ToList(); 


     var groupedData = from data in salesAndreceipts 
          group data by new {id=data.CustomerID} 
           into SalesRecepientGroup 
           Select new 
           { 
            id = SalesRecepientGroup.Key.CustomerID, 
            sales = SalesRecepientGroup.Sum(x=>x.Sales), 
            receipts = SalesRecepientGroup.Sum(x=>x.Amount) 

           }; 

希望這有助於.. :)

更新

然後,您可以檢查它在EFProfiler下生成的查詢並優化這些查詢。

+0

Yogiraj!他們是您的salesAndreceipts查詢中的邏輯錯誤,因爲銷售和收貨表格沒有1:N關係。在您的代碼中,它將從「銷售」將所有特定客戶的行連接到「收據」中特定客戶的所有行。 這就是爲什麼我使用.Union()加入了兩個查詢。 –

+0

您可以在聯盟數據上運行groupby,並在答案 – Yogiraj