2010-09-13 3 views
1

Я получаю данные с уровня данных, который мне нужно преобразовать в среднем ярусе, используя Linq To Objects (я не контролирую этот уровень приложения). Мне нужно выполнить операцию группировки с использованием нескольких ключей, за которыми следует конкатенация строк в не-ключевых полях. Учитывая приведенные ниже данные, я хочу сгруппировать по CustomerID и Date и создать новую структуру, в которой на основе ключа генерируется только одна строка, а поле non key (в данном случае 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 функционального стиля или мне нужно прибегнуть к синтаксису синтаксического синтаксиса старой школы?

ответ

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? Разве это не нужно группировать дважды? –

+0

@ Zachary Yates: Что? – dtb

+0

Вы изменили его, прежде чем я смог закончить публикацию комментария :) –

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()». –

+0

@Jimmy W: [String.Join] (http://msdn.microsoft.com/en-us/library/dd992421.aspx) имеет перегрузку, которая принимает любой IEnumerable <> с .NET 4.0. – dtb

+0

А, я использовал .NET 3.5. Имеет смысл. –