#c# #linq #datatable
#c# #linq #datatable
Вопрос:
Ввод
У меня есть a DataTable
со следующей структурой (с некоторыми значениями выборки):
Вывод
Я хочу иметь DataTable
подобное, которое содержит результат вычисления:
Логика преобразования
- Я хочу суммировать значение, где
Date
Interval
иType
одинаковы.
Сохранить логику
- Я хочу скопировать результат в другой
DataTable
. - Я хочу сохранить эту копию в своей основной таблице в 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. Да, очевидно, и не только интервал.