Linq: Как преобразовать строки в столбцы с количеством (данные кросс-таблицы)? - PullRequest
3 голосов
/ 09 марта 2010

Я думаю, что мне нужен способ выполнить сводную или перекрестную таблицу, используя C # и Linq с неопределенным числом столбцов. Тем не менее, я добавлю некоторые начальные подробности, чтобы увидеть, куда это идет.

<Начальная деталь>

Представьте себе таблицу с двумя полями:

string EventName;
Datetime WhenItHappend;

Мы хотим сгенерировать отчет, как в примере ниже, где мы группируем по EventName, а затем имеем ряд столбцов, которые вычисляют некоторое количество дат и временных рамок. Трудность, очевидно, заключается в переменном количестве столбцов.

Спорт январь 2010 январь 2009 февраль 2010 февраль 2009
Баскетбол 26 18 23 16
Хоккей 28 19 25 18
Плавание 52 45 48 43

Клиент может создать любое количество именованных счетчиков событий для отчета. Функции всегда одинаковы: «Имя», «Начало», «Конец».

Любой способ собрать это как один результат linq IQueryable в C #?

<Конец Начальной детали>

Что касается SQL, я попытался создать таблицу диапазонов дат {TimeFrameName, begin, end} и соединил ее с таблицей выше, где begin <= whenItHappened и whenItHappened <= end, что привело к хорошему набору {EventName, TimeFrameName} затем сделал подсчет (*), но все равно остался способ преобразования данных, превращая строки в столбцы. </p>

1 Ответ

2 голосов
/ 09 марта 2010

У вас есть класс / строка SQL

class Thing
{
    public string EventName;
    public DateTime WhenItHappend;
}

и вы хотите сгруппировать по EventName и WhenItHappened.Month

// make a collection and add some Things to it
var list = new List<Thing>();
list.Add(new Thing(){ .... });
// etc

var groups = list.GroupBy(t => new { t.WhenItHappend.Month, t.EventName } );

Теперь у вас, по сути, есть двумерный массив коллекций. Вы можете просмотреть их в Month / EventName, чтобы получить количество элементов в каждой коллекции, которое вы хотите отобразить в своей таблице.

foreach (var row in groups.GroupBy(g => g.Key.EventName))
{
    foreach (var month in row.GroupBy(g => g.Key.Month))
    {
        var value = month.Count();
    }
}

Оператор GroupBy возвращает коллекцию групп, где каждая группа содержит ключ и подмножество исходного списка, которые соответствуют указанному ключу. Если вы укажете двумерный ключ, вы можете рассматривать результат как двумерный массив коллекций.

GroupBy - очень мощный оператор!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...