2013-08-19 2 views
1

У меня есть следующая плоская структура:Агрегирование порядка строк в резюме заказа - как получить количество

Name1 | Name2 | Price | SubName | SubPrice 
------+-------+-------+---------+--------- 
A  | one | 10 | X  | 5 
A  | one | 10 | Y  | 7 
A  | one | 10 | Z  | 11 
A  | one | 10 | X  | 5 
A  | one | 10 | Y  | 7 
A  | one | 10 | Z  | 11 
A  | two | 16 | X  | 5 
A  | null | 9 | null | null 
B  | three | 24 | null | null 

Она должна быть преобразована в следующее:

{ 
    0 = { 
    Name  = "A one X, Y, Z", 
    Quantity = 2, 
    TotalPrice = 66, 
    }, 
    1 = { 
    Name  = "A two X", 
    Quantity = 1, 
    TotalPrice = 21, 
    }, 
    2 = { 
    Name  = "A", 
    Quantity = 1, 
    TotalPrice = 9, 
    }, 
    3 = { 
    Name  = "B three", 
    Quantity = 1, 
    TotalPrice = 24, 
    } 
} 

Теория проста - .GroupBy() Name1 и Name2 - проблема в том, что, как только я доберусь до .Select(), я не могу получить правильное количество ... Я знаю, что это должно быть просто, но я просто не могу это понять ...

items 
    .GroupBy(item => new 
      { 
      item.Name1, 
      item.Name2, 
      }) 
    .Select(grouping => new 
      { 
      Name = grouping.Key.Name1 + " " + grouping.Key.Name2, 
      Price = grouping.Key.Price, 
      Subs = grouping.GroupBy(groupItem => new 
            { 
             groupItem.SubName, 
             groupItem.SubPrice, 
            }), 
      }) 
    .Select(temp => new 
      { 
      Name = temp.Name + (temp.Subs.Any() ? " " + temp.Subs.Select(sub => sub.SubName).Aggregate((a, b) => (a + ", " + b)) : string.Empty), 
      FullItemPrice = temp.Price + temp.Subs.Sum(subPrice => subPrice ?? 0m), 
      Quantity = ???, 
      }) 
    .Select(output => new 
      { 
      output.Name, 
      output.Quantity, 
      TotalPrice = output.FullItemPrice * output.Quantity, 
      }); 
+0

Как вы рассчитываете 'TotalPrice' в желаемых результатах? – MarcinJuraszek

+0

FullItemPrice = Цена + (сумма подцентов). Итак, для A, 10 + (5 + 7 + 11) = 33, и есть 2 A, поэтому TotalPrice = 33 * 2 = 66 –

ответ

0
var source = new List<Item>(9) { 
    new Item { Name1 = "A", Name2 = "One", Price = 10, SubName = "X", SubPrice = 5}, 
    new Item { Name1 = "A", Name2 = "One", Price = 10, SubName = "Y", SubPrice = 7}, 
    new Item { Name1 = "A", Name2 = "One", Price = 10, SubName = "Z", SubPrice = 11}, 
    new Item { Name1 = "A", Name2 = "One", Price = 10, SubName = "X", SubPrice = 5}, 
    new Item { Name1 = "A", Name2 = "One", Price = 10, SubName = "Y", SubPrice = 7}, 
    new Item { Name1 = "A", Name2 = "One", Price = 10, SubName = "Z", SubPrice = 11}, 
    new Item { Name1 = "A", Name2 = "Two", Price = 16, SubName = "X", SubPrice = 5}, 
    new Item { Name1 = "A", Name2 = null, Price = 9, SubName = null, SubPrice = 0 }, 
    new Item { Name1 = "B", Name2 = "three", Price = 24, SubName = null, SubPrice = 0} 
}; 

var grouped = source.GroupBy(x => new { x.Name1, x.Name2 }) 
        .Select(g => new 
        { 
         Name = string.Format("{0} {1} {2}", g.Key.Name1, g.Key.Name2, string.Join(", ", g.Select(x => x.SubName))).Trim(), 
         Quantity = g.Count()/g.Select(x => x.SubName).Distinct().Count() 
        }) 
        .ToList(); 

Но вам все еще нужно реализовать вам Price расчета логики.

Смежные вопросы