Member 12685556 Ответов: 1

Суммирование столбцов с помощью linq


Мне нужно сделать суммирование столбцов datatable. Datatable пример, как показано ниже -
Datatable (dtrec)

 COL1   COL2  COL3   ID    AMT   PERCENTAGE  COL4
-----------------------------------------------------
 2022                1234  400   .20         213 
 2022                1234  400   .20


С помощью инструкции LINQ ниже я получаю выход, как ниже -
Datatable (dt)

 COL1   COL2  COL3   ID    AMT   PERCENTAGE  COL4
-----------------------------------------------------
                     1234  800     .40         


DataTable dt = dtrec.AsEnumerable()
                .GroupBy(r => r.Field<decimal>("ID"))
                 .Select(g =>
                 {
                       var row = dtrec.NewRow();
                       row["ID"] = g.Key;
                       row["AMT"] = g.Sum(r => r.Field<decimal>("AMT"));
                       row["PERCENTAGE"] = g.Sum(r => r.Field<decimal>("PERCENTAGE"));
                       return row;
                 }).CopyToDataTable();

ожидаемый результат -

 COL1   COL2  COL3   ID    AMT   PERCENTAGE  COL4
-----------------------------------------------------
 2022                1234  800   .40         213 


Здесь данные COL1 и COL4 становятся пустыми, мое требование заключается в том, что оператор linq будет выбирать все столбцы из datatable и дополнительно суммировать столбцы AMT и PERCENTAGE. Как показано в ожидаемом результате.

Еще один важный момент, чтобы рассмотреть, что, помимо удостоверения личности, АМТ и процент столбцов, остальные столбцы являются динамическими, т. е. колонны может увеличиться (например, столбец col1, столбец col2, с col3, COL4, COl5.... и т. д.), Следовательно, мы не можем включить на col1-COL4 или внутри оператора SELECT.

Любое предложение было бы полезно.

Спасибо

Что я уже пробовал:

DataTable dt = dtrec.AsEnumerable()
                .GroupBy(r => r.Field<decimal>("ID"))
                 .Select(g =>
                 {
                       var row = dtrec.NewRow();
                       row["ID"] = g.Key;<pre lang="text">
                       row["AMT"] = g.Sum(r => r.Field<decimal>("AMT"));
                       row["PERCENTAGE"] = g.Sum(r => r.Field<decimal>("PERCENTAGE"));
                       return row;
                 }).CopyToDataTable();

1 Ответов

Рейтинг:
1

Maciej Los

Цитата:
следовательно, мы не можем включить COL1 или COL4 в оператор select.


- Вы уверены? ;)

Попробовать это:
DataRow[] totals = dtrec.AsEnumerable()
	.GroupBy(x=>x["ID"])
	.Select(grp=> dt.LoadDataRow(new object[]
		{
			grp.Select(y=>y["COL1"]).FirstOrDefault(),
			grp.Select(y=>y["COL2"]).FirstOrDefault(),
			grp.Select(y=>y["COL3"]).FirstOrDefault(),
			grp.Key,
			grp.Sum(y=>y.Field<int>("AMT")),
			grp.Sum(y=>y.Field<double>("PERCENTAGE")),
			grp.Sum(y=>y.Field<int?>("COL4")==(int?)null ? 0 : y.Field<int?>("COL4"))
		}, false)
	).ToArray();