2010-09-13 64 views
1

我從中間層使用Linq To Objects(我不控制該層的應用程序)轉換數據層中的數據。我必須使用多個鍵執行分組操作,然後在非關鍵字段上進行字符串連接。鑑於以下數據,我想按CustomerID和Date進行分組,並創建一個新的結構,其中基於密鑰生成僅一行,非密鑰字段(在此情況下爲Item)合併爲一個字符串:使用Linq To Objects執行分組/投影的最簡單方法

CustomerID Date   Item 
    A   11/1/2001 Bread 
    A   11/1/2001  Orange Juice 
    A   11/1/2001  Salad Dressing 
    B   11/1/2001 Bananas 
    C   5/6/2001  Candy 
    C   12/8/2005 Candy    


    CustomerID Date   Item 
    A   11/1/2001 Bread 
          Orange Juice 
          Salad Dressing 
    B   11/1/2001 Bananas 
    C   5/6/2001  Candy 
    C   12/8/2005 Candy 

這是可能的使用功能樣式linq語法還是必須求助於老派命令式的foreach語法?

回答

2

這樣的事情?

var result = from item in items 
      group item by new { item.Date, item.CustomerID } into g 
      select new 
      { 
       g.Key.CustomerID, 
       g.Key.Date, 
       Item = string.Join(", ", from i in g select i.Item) 
      }; 
+0

只有.Min日期?是否需要分組兩次? – 2010-09-13 19:04:04

+0

@Zachary Yates:什麼? – dtb 2010-09-13 19:05:21

+0

你可以在發佈評論之前更改它:) – 2010-09-13 19:09:21

3

或者:

var results = items 
    .GroupBy(i => new { i.Date, i.CustomerID }) 
    .Select(g => new { 
    CustomerID = g.Key.CustomerID, 
    Date = g.Key.Date, 
    Item = string.Join(", ", g.Select(i => i.Item).ToArray()) 
    }); 
+0

我在VS中寫過同樣的東西,但是編譯器抱怨將一個IEnumerable <>作爲string.Join()的參數。這將工作:「g.Select(i => i.Item).ToArray()」。 – 2010-09-13 19:16:48

+0

@Jimmy W:[String.Join](http://msdn.microsoft.com/zh-cn/library/dd992421.aspx)有一個自.NET 4.0以來的任何IEnumerable <>的重載。 – dtb 2010-09-13 19:17:50

+0

啊,我正在使用.NET 3.5。說得通。 – 2010-09-13 19:31:32