c # Суммировать значения того же интервала, даты и типа из datatable

#c# #linq #datatable

#c# #linq #datatable

Вопрос:

Ввод

У меня есть a DataTable со следующей структурой (с некоторыми значениями выборки):

пример ввода

Вывод

Я хочу иметь DataTable подобное, которое содержит результат вычисления:

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

Логика преобразования

  • Я хочу суммировать значение, где Date Interval и Type одинаковы.

Сохранить логику

  1. Я хочу скопировать результат в другой DataTable .
  2. Я хочу сохранить эту копию в своей основной таблице в SQL server.

Соображения / требования

  • Я хотел бы сделать это с помощью LINQ.
  • Я не хочу использовать для этого временную таблицу в SQL server.

Мой код (пока)

 var result = dt.AsEnumerable().GroupBy(row => new
    {
        Date = row.Field<DateTime>("Date"),
        Interval = row.Field<DateTime>("Interval"),
        Type = row.Field<string>("Type")
    })
    .Select(a =>
    {
        var row = a.First();
        row.SetField("Value", a.Sum(r => r.Field<double> "Value")));

        return row;
    });

var resultdt = result.CopyToDataTable();
  

Комментарии:

1. Пожалуйста, покажите свой код. Это облегчило бы помощь.

2. Мне нечего показать. Я не знаю, как это сделать, потому что мне нужно сгруппировать их по интервалу, дате, типу и получить сумму одного и того же интервала. Слишком много параметров, которые я не могу синтаксически использовать. Я могу использовать синтаксис только для выражения с одной группой by и одним простым where, а не this . Вот почему я прошу о помощи.

3. Я опубликовал некоторый код после прочтения некоторых других тем о linq.

4. @Kate10 В чем проблема с вашим текущим решением?

5. Используйте GroubBy(x => Интервал. Date : свойство date обрезает дату до полуночи в начале дня и удаляет часы, минуты, секунды от времени.

Ответ №1:

 using System;
using System.Data;
using System.Linq;

namespace ConsoleApp4
{
    class Program
    {
        static void Main(string[] args)
        {

            //Dummy data for demo purpose
            DataTable dt = new DataTable();
            dt.Columns.Add("Type");
            dt.Columns.Add("Date");
            dt.Columns.Add("Inverval");
            dt.Columns.Add("Value");

            dt.Rows.Add("one", "1/1/2020", 0.00, 11);
            dt.Rows.Add("one", "1/1/2020", 0.00, 1);
            dt.Rows.Add("one", "1/1/2020", 0.15, 1);
            dt.Rows.Add("two", "1/1/2020", 0.00, 6);
            dt.Rows.Add("two", "1/1/2020", 0.00, 2);
            dt.Rows.Add("two", "1/1/2020", 0.15, 4);


            var result = from tab in dt.AsEnumerable()
                         group tab by new
                         {
                             Type = tab["Type"],
                             Date = tab["Date"],
                             Inverval = tab["Inverval"]
                         }
                into groupDt
                         select new
                         {
                             Type = groupDt.Key.Type,
                             Date = groupDt.Key.Date,
                             Inverval = groupDt.Key.Inverval,
                             Value= groupDt.Sum((r) => decimal.Parse(r["Value"].ToString()))
                         };

        }
    }
}
  

Комментарии:

1. Спасибо, что написали это. Я проверю это и свяжусь с вами.

2. Как мне скопировать результат в datatable?

Ответ №2:

вам нужно использовать GroupBy. Попробуйте, как:

 myDataTable.AsEnumerable().GroupBy(x => x.Interval)
  

Комментарии:

1. Да, очевидно, и не только интервал.