2015-05-03 78 views
0

我在我的LINQ Group By子句中使用Dictionary對象。LINQ與GroupBy使用字典對象

只要我沒有重複,它就能正常工作產品名稱中的結果。

但是,它在GroupBy查詢遇到重複的項目名稱時失敗。

我不確定我是否正確使用了GroupBy子句中的Dictionary對象?請指教。

這是我的模型

public class Item 
{ 
    public string CustomerName { get; set; } 
    public Dictionary<string, float?> ItemCost { get; set; } 
    public float? Cost{ get; set; } 
    public float? TotalCost{ get; set; } 
} 

以下是我的選擇查詢(LINQ)用的GroupBy

 var result = myFilteredQuery 
      .Select(x => new 
      { 
       ItemName = x.Item.Name, 
       Cost= x.Item.Cost, 
       CustomerName = x.Item.Customer.Name, 

      }).ToList(); 

以下是我的GroupBy查詢一起。

  return result .GroupBy(x => new { x.CustomerName}) 
      .Select(x => new CostByItem 
      { 
       CustomerName = x.Key.CustomerName, 
       LineItem = x.ToDictionary(y => y.ItemName, y => y.Cost), 
       TotalCost= x.Sum(y => y.Cost) 
      }).ToList(); 

p.s.我試圖發送創建數據結構Group By Customer,並且比每個客戶字典對象項目成本(項目名稱,項目成本)和該客戶的總成本下。

+0

失敗?您收到的任何錯誤消息?請具體說明。 –

+0

我收到此錯誤「已添加具有相同密鑰的項目。」 – immirza

+1

很明顯!您正在通過'CustomerName'而不是'ItemName'進行分組,因此如果任何客戶下有任何重複的ItemName,都會出現該錯誤。 –

回答

1

如果我的理解正確,您希望按客戶對項目進行分組,然後按照名稱對項目進行分組。您需要使用GroupBy兩次

result.GroupBy(x => x.CustomerName) 
     .Select(x => new CostByItem 
     { 
      CustomerName = x.Key, 
      LineItem = x.GroupBy(y => y.ItemName) 
         .ToDictionary(y => y.Key, y => y.Sum(z => z.Cost)), 
      TotalCost = x.Sum(y => y.Cost) 
     }).ToList(); 

另外請注意,沒有必要使用x => new { x.CustomerName}。按字符串值分組就足夠了 - 創建匿名類型是不必要的。

+0

awsome。我正在尋找這個。謝謝 – immirza