Использование Linq для создания результатов кросс-таблицы

Возможный дубликат:
Возможно ли сводить данные с помощью LINQ?

Мне интересно, возможно ли вообще создавать результаты в стиле кросс-таблицы с помощью Linq. У меня есть данные, которые выглядят следующим образом:

    var list = new[]
    {
        new {GroupId = 1, Country = "UK", Value = 10},
        new {GroupId = 1, Country = "FR", Value = 12},
        new {GroupId = 1, Country = "US", Value = 18},
        new {GroupId = 2, Country = "UK", Value = 54},
        new {GroupId = 2, Country = "FR", Value = 55},
        new {GroupId = 2, Country = "UK", Value = 56}
    };

и я пытаюсь вывести на элемент управления повторителем что-то вроде следующего:

GroupId.....UK.....FR.....US
1...........10.....12.....18
2...........54.....55.....56

Мои проблемы возникают из-за динамических столбцов. Какие-нибудь решения для этого?


person Community    schedule 26.11.2008    source источник
comment
Этот вопрос задает сводку по столбцам с неизвестными результатами. Предлагаемый дубликат основан на столбцах с известными результатами. Эти две ситуации совершенно разные. Голосование для открытия.   -  person Amy B    schedule 13.12.2012


Ответы (4)


Вам нужен runtimy класс для хранения этих runtimy результатов. Как насчет xml?

XElement result = new XElement("result",
  list.GroupBy(i => i.GroupId)
  .Select(g =>
    new XElement("Group", new XAttribute("GroupID", g.Key),
      g.Select(i => new XAttribute(i.Country, i.Value))
    )
  )
);

Вы ожидаете, что в каждой ячейке результата будет несколько записей? Если это так, там должно быть некоторое суммирование (и больше группировок).

(этот ответ является доказательством концепции, а не окончательным результатом. Необходимо решить несколько проблем, таких как порядок столбцов, отсутствующие ячейки и т. д.).

person Amy B    schedule 26.11.2008

После быстрого поиска вы можете захотеть взглянуть на классы ModuleBuilder, TypeBuilder и FieldBuilder в System.Reflection.Emit. Они позволяют динамически создавать класс во время выполнения. Помимо этого, вам нужно будет выполнить группировку ваших объектов, а затем что-то сделать с иерархическими результатами, полученными от LINQ. Я не уверен в способе динамического создания полей анонимного типа во время выполнения, и это похоже на то, что должно произойти.

person David    schedule 26.11.2008
comment
Не могли бы вы сообщить мне, почему это было отклонено? Где я ошибаюсь? - person David; 24.12.2008

Вы можете попробовать использовать динамическую библиотеку linq, предоставленную MS. У них есть несколько перегрузок для методов расширений, которые принимают строки в качестве аргументов. У них также есть синтаксический анализатор выражений, который принимает строку и выдает лямбда-выражение. Вы должны иметь возможность создавать с их помощью динамическое выделение.

Однако небольшое предупреждение: вы получаете не общий IQueryable, а не общий IQueryable, поэтому вы немного ограничены в том, что вы можете сделать с результатом, и немного отказываетесь от безопасности типов, но это может быть ОК в вашем приложении ...

Ссылка на динамический материал linq:

http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

Есть ссылка, по которой вы можете скачать исходный код динамической библиотеки, а также несколько хороших иллюстраций того, как вы можете ее использовать.

person Community    schedule 01.04.2009

person    schedule
comment
Простое решение ... но оно не сработает, если вы не знаете, какое значение будет иметь Lab. - person Quango; 01.03.2013