2014-12-05 4 views
0

Мне нужно создать динамические отчеты, используя LINQ для данных. Содержимое данных datatable неизвестно до тех пор, пока пользователь не задаст данный сложный запрос. Следующий запрос LINQ будет работать, если поля известны:Linq to DataTable (GROUP BY), когда столбцы не известны

var groups = results.AsEnumerable(); 

var groupList = from g in groups 
       group g by g.Field<string>(column) into Grup 
        select new { 
          GroupedBy = Grup.Key, 
          CountValue = Grup.Count(r=>r.Field)<int>(countColumn)) 
        }; 

Однако, так как я не знаю, типа поля, когда столбец целого типа (или отличаются от строки) код потерпит неудачу в:

   group g by g.Field<string>(column) into Grup 

так как он не может преобразовать int в строку. Ошибка заключается в следующем:

Невозможно привести объект типа «System.Int32» для типа «System.String»

Любые предложения о том, как это исправить? Я пытался определить тип данных колонки с использованием:

results.Columns[column].DataType 

, а затем использовать тип данных для литья, но это не работает, по-видимому. Что-то похожее на это:

group g by g.Field<results.Columns[column].DataType>(column) into Grup 
+0

Использование Grup вместо Grupi в вашем выборе. – Rahul

+0

Grup/Grupi - это просто опечатка, так как я укоротил код, чтобы опубликовать его здесь. Теперь я его отредактирую. Проблема все еще сохраняется. – user10901

+0

Посмотрите на это http://stackoverflow.com/questions/17678197/linq-grouping-dynamically – Rahul

ответ

0

Могли бы вы не просто не использовать метод расширения и использовать Item вместо этого?

Как:

var groups = results.AsEnumerable(); 

var groupList = from g in groups 
      group g by g.Item[column] into Grup 
       select new { 
         GroupedBy = Grupi.Key, 
         CountValue = Grupi.Countr=>r.Field<int>(countColumn)) 
       }; 

Конечно же, вы будете нести бокс/распаковку, но учитывая то, как вы имеете дело с динамическим выходом, я думаю, что это происходит с этой территорией.

+0

Я пытаюсь использовать этот подход, но я получаю следующее: «« System.Data.DataRow »не содержит определения для ' Item 'и не существует метода расширения' Item ', принимающего первый аргумент типа' System.Data.DataRow ', можно найти « – user10901

+0

Существует недоверчивость, я думаю !? – user10901

+0

Да, может быть. Вот ссылка msdn: http://msdn.microsoft.com/en-us/library/system.data.datarow.item%28v=vs.110%29.aspx. Странно, однако, если вы используете расширения набора данных, вы должны использовать System.Data. Убедитесь, что у вас есть предложение use для System.Data ... – code4life