2013-05-11 5 views
2

Привет всем Я имею мои данные в DataTable следующегоSum данные таблиц столбцы с помощью LINQ

SKU Quantity UnitPrice LinePrice 
A  10   2   20 
A  10   2   20 
B  10   2   40 

Я хотел бы подытожить SKU с дублированием записей и получить результат следующего

SKU Quantity UnitPrice LinePrice 
A  20   2   40 
B  10   2   40 

Я попытался это, но не повезло

var query = from row in lDTSalesOrder.AsEnumerable() 
          group row by row.Field<string>("SKU") into grp 
          orderby grp.Key 
          select new 
          { 
           Id = grp.Key, 
           Sum = grp.Sum(r => r.Field<double>("UnitPrice")) 
          }; 
+0

Почему вы делаете lDTSalesOrder перечислимого если вы запросов к базе данных? –

+0

В чем проблема? Я выполнил ваш код и вернул действительные результаты. – Kamyar

ответ

3

В вашем примере вывода вы на самом деле не суммированного цена единицы, но Soun DS, как то, что вы хотите что-то вроде этого:

var results = 
    from row in lDTSalesOrder 
    group row by row.Field<string>("SKU") into grp 
    orderby grp.Key 
    select new 
    { 
     SKU = grp.Key, 
     Quantity = grp.Sum(r => r.Field<double>("Quantity")), 
     UnitPrice = grp.Sum(r => r.Field<double>("UnitPrice")), 
     LinePrice = grp.Sum(r => r.Field<double>("LinePrice")) 
    }; 

Это будет производить:

SKU Quantity UnitPrice LinePrice 
A  20   4   40 
B  10   2   40 

Если вы действительно хотите, чтобы произвести цена единицы 2 для первого результата записи, Sum является не то, что вы хотите; вам придется использовать некоторые другие функции агрегата. Min, Max, Average или даже Select(...).First() произведут этот результат, но вам нужно будет более точно определить, что вы хотите в своем выходе. Вы также можете сделать это:

var results = 
    from row in lDTSalesOrder 
    group row by new { SKU = row.Field<string>("SKU"), UnitPrice = row.Field<string>("UnitPrice") } into grp 
    orderby grp.Key.SKU 
    select new 
    { 
     SKU = grp.Key.SKU, 
     Quantity = grp.Sum(r => r.Field<double>("Quantity")), 
     UnitPrice = grp.Key.UnitPrice, 
     LinePrice = grp.Sum(r => r.Field<double>("LinePrice")) 
    }; 

Любой из этих вариантов будет производить:

SKU Quantity UnitPrice LinePrice 
A  20   2   40 
B  10   2   40 
+0

UnitPrice не предполагается суммировать – lisp

+0

@lisp Непонятно, как обращаться с 'UnitPrice', но я попытался добавить несколько решений, которые производят вывод выборки OP. –

+0

Привет Я получаю сообщение об ошибке «не удалось найти реализацию шаблона запроса для типа источника« System.Data.DataTable ». «GroupBy» не найден .' – Dotnet