Данные сводного списка с использованием LINQ - PullRequest
0 голосов
/ 28 марта 2012

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

cvMesFicFin cvAnoFicFin cvVlrBasFicFin
08          1998            30
09          1998            30
10          1998            30
11          1998            30
12          1998            30
01          1999            30
02          1999            30
03          1999            30
04          1999            30
05          1999            30
06          1999            30

примерно так:

Year    01  02  03  04  05  06  07  08  09  10  11  12
1998    NULL    NULL    NULL    NULL    NULL    NULL    NULL    30  30  30  30  30
1999    30  30  30  30  30  30  NULL    NULL    NULL    NULL    NULL    NULL

1 Ответ

2 голосов
/ 28 марта 2012

Я бы использовал что-то вроде этого:

var r = a.GroupBy(e => e.cvAnoFicFin).Select(g => new
{
    Year = g.Key,
    Jan = g.Where(e => e.cvMesFicFin == 1)
           .Select(c => (int?)c.cvVlrBasFicFin).SingleOrDefault(),
    Feb = g.Where(e => e.cvMesFicFin == 2)
           .Select(c => (int?)c.cvVlrBasFicFin).SingleOrDefault(),
    Mar = g.Where(e => e.cvMesFicFin == 3)
           .Select(c => (int?)c.cvVlrBasFicFin).SingleOrDefault(),
    Apr = g.Where(e => e.cvMesFicFin == 4)
           .Select(c => (int?)c.cvVlrBasFicFin).SingleOrDefault(),
    May = g.Where(e => e.cvMesFicFin == 5)
           .Select(c => (int?)c.cvVlrBasFicFin).SingleOrDefault(),
    Jun = g.Where(e => e.cvMesFicFin == 6)
           .Select(c => (int?)c.cvVlrBasFicFin).SingleOrDefault(),
    Jul = g.Where(e => e.cvMesFicFin == 7)
           .Select(c => (int?)c.cvVlrBasFicFin).SingleOrDefault(),
    Aug = g.Where(e => e.cvMesFicFin == 8)
           .Select(c => (int?)c.cvVlrBasFicFin).SingleOrDefault(),
    Sep = g.Where(e => e.cvMesFicFin == 9)
           .Select(c => (int?)c.cvVlrBasFicFin).SingleOrDefault(),
    Oct = g.Where(e => e.cvMesFicFin == 10)
           .Select(c => (int?)c.cvVlrBasFicFin).SingleOrDefault(),
    Nov = g.Where(e => e.cvMesFicFin == 11)
           .Select(c => (int?)c.cvVlrBasFicFin).SingleOrDefault(),
    Dec = g.Where(e => e.cvMesFicFin == 12)
           .Select(c => (int?)c.cvVlrBasFicFin).SingleOrDefault()
});

Идея украдена из этого ответа: https://stackoverflow.com/a/167937/276994.

Если данные представляют записи базы данных, то, возможно, cvVlrBasFicFinуже обнуляется, поэтому приведение не требуется.

...