C# linq лямбда-выражение группирует по нескольким столбцам и получает первые элементы группы - PullRequest
0 голосов
/ 12 июля 2020

Вот как выглядят данные моей таблицы:

   Id          C1            C2             C3 
 -------------------------------------------------
   1           John          1990           A
   2           John          1990           B
   3           John          2000           C
   4           Mary          2001           D
   5           Mary          2010           E 
   6           Mary          2010           F
   7           Jack          2010           G
   8           Jack          2010           H
   9           Jack          2011           I

Я хочу сгруппировать по столбцам C1, C2 и получить первые элементы каждой группы, упорядоченные по C3 столбец по убыванию. Таким образом, результат будет похож на

      Id          C1            C2             C3 
     -------------------------------------------------
       1           John          1990           B
       3           John          2000           C
       4           Mary          2001           D
       5           Mary          2010           F 
       7           Jack          2010           H
       9           Jack          2011           I

И я также хочу отфильтровать строки с номерами от 2 до 5, используя функции skip и take. Таким образом, результат Final должен быть похож на

          Id          C1            C2             C3 
         -------------------------------------------------
           3           John          2000           C
           4           Mary          2001           D
           5           Mary          2010           F 
           7           Jack          2010           H

То, что я пробовал, это

await data.GroupBy(d => new { d.C1, d.C2 }).Skip(1).Take(4).FirstAsync();  

Но он только повторно запускает одну строку. Как я могу решить эту проблему?

Ответы [ 2 ]

1 голос
/ 12 июля 2020

Вы можете сделать это,

using System; 
using System.Linq; 
using System.Collections.Generic;
...

var result = await data.GroupBy(d => new { d.C1, d.C2 }) //Group by C1 and C2
                 .Select(s => s.First())  //Select first record from each Group
                 .Skip(1)     //Skip first record
                 .Take(4)     //Pick up next 4 records
                 .ToListAsync()    //Convert 4 records to List.
1 голос
/ 12 июля 2020

Вам нужно сделать Select, и, поскольку будет несколько результатов, вам нужно будет вместо этого использовать ToListAsync.

data.GroupBy(d => new { d.C1, d.C2 })
   .Select(grp => grp.First())
   .Skip(1)
   .Take(4)
   .ToListAsync();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...