У меня есть DataTable в VB.NET такого типа:

"Yr","Mnth","Period","Amount"
2016, 1, 2016-01, 550.36
2016, 1, 2016-01, 9000.79
2015, 12, 2015-12, 10000.30
2015, 12, 2015-12, 20

Что я хочу сделать, так это агрегировать эти данные с помощью LINQ, как я бы это сделал на языке SQL:

SELECT Yr, Mnth, Period, SUM(Amount) AS Amount
GROUP BY Yr, Mnth, Period;

Я пытался использовать LINQ в VB.NET, но не смог понять это правильно. Может кто-нибудь дать мне некоторое представление? Спасибо.

1
rffs 18 Апр 2016 в 19:55

2 ответа

Лучший ответ
Dim Amounts As New DataTable 'Your code to load actual DataTable here
Dim amountGrpByDates = From row In Amounts
                       Group row By dateGroup = New With {
                                                    Key .Yr = row.Field(Of Integer)("Yr"),
                                                    Key .Mnth = row.Field(Of Integer)("Mnth"),
                                                    Key .Period = row.Field(Of String)("Period")
                                               } Into Group
                       Select New With {
                                  Key .Dates = dateGroup,
                                      .SumAmount = Group.Sum(Function(x) x.Field(Of Decimal)("Amount"))}

Я предположил, что Yr и Mnth имеют тип Integer, Period String и Amount Decimal. Измените типы, если они отличаются от вашего.

2
Alex B. 18 Апр 2016 в 17:51

Вот код C #.

public static class program
{
    static void Main(string[] args)
    {

        try
        {
            var table = new DataTable();
            table.Columns.Add("year", typeof(string));
            table.Columns.Add("month", typeof(string));
            table.Columns.Add("period", typeof(string));
            table.Columns.Add("amount", typeof(decimal));

            var row = table.NewRow();
            table.Rows.Add(row);
            row["year"] = "2015";
            row["month"] = "Jan";
            row["period"] = "Period1";
            row["amount"] = 100;


            row = table.NewRow();
            table.Rows.Add(row);
            row["year"] = "2015";
            row["month"] = "Jan";
            row["period"] = "Period1";
            row["amount"] = 50;

            row = table.NewRow();
            table.Rows.Add(row);
            row["year"] = "2016";
            row["month"] = "Fed";
            row["period"] = "Period2";
            row["amount"] = 5.55;


            var result = (from r in table.AsEnumerable()
                          group r by new
                          {
                              Year = r.Field<string>("year"),
                              Month = r.Field<string>("month"),
                              Period = r.Field<string>("period"),
                          } into grp
                          select new {
                              grp.Key,
                              total = grp.Sum(p=> p.Field<decimal>("amount"))
                          });


            foreach(var grp in result)
            {
                Console.WriteLine("{0} {1} {2} = {3}", grp.Key.Year, grp.Key.Month, grp.Key.Period, grp.total); 
            }


        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }

    }

}
-1
dfdsfdsfsdf 18 Апр 2016 в 17:09