2008-11-26 2 views
8

Можно создать дубликат:
Is it possible to Pivot data using 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 

Сво динамических столбцов, которые вызывают мои проблемы , Любые решения?

+3

Этот вопрос задает вопрос о стержне с неизвестными столбцами результата. Предлагаемый дубликат является стержнем против известных столбцов результатов. Эти две ситуации совершенно разные. Голосование для повторного открытия. – 2012-12-13 15:46:13

ответ

1

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

+0

Не могли бы вы сообщить мне, почему это было отклонено? Где я ошибаюсь? – David 2008-12-24 20:07:02

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)) 
    ) 
) 
); 

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

(этот ответ является доказательством концепции, а не конечным результатом. Существует несколько вопросов, на которые следует обратить внимание, например: упорядочение столбцов, отсутствие ячеек и т. Д.).

1

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

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

ссылка для динамического материала Linq является

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

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

1
var labResults = from lab in CoreLabResults 
       where lab.Patient == 8 
       group lab by new { lab.Patient, lab.TestNo, lab.CollectedDate } 
        into labtests 
        select new 
        { 
         labtests.Key.Patient, 
         labtests.Key.TestNo, 
         labtests.Key.CollectedDate, 
         MCHC = labtests.Where(lab => lab.TestVar == "MCHC").FirstOrDefault().Result, 
         LYABS = labtests.Where(lab => lab.TestVar == "LYABS").FirstOrDefault().Result, 
         TotalTests = labtests.Count() 
        } 
+1

Простое решение .. но оно не будет работать там, где вы не знаете, какое значение получит «Лаборатория». – Quango 2013-03-01 09:20:38