2016-01-28 5 views
-2

Я пытаюсь подвести итог столбцу DataTable в linq. Но когда программа запущена, цикл foreach не выполняется. Я уже проверял milion раз, если имена столбцов равны datatable.Запрос Linq не выполняется должным образом

resultDataTable.Columns.Add("User ID"); 
resultDataTable.Columns.Add("Amount"); 
resultDataTable.Columns.Add("Order number"); 


var query = from row in result.AsEnumerable() 
      group row by row.Field<string>("User ID") into grp     
      select new 
      { 
       Id = grp.Key, 
       Sum = grp.Sum(r => r.Field<int>("Amount")), 
       Sum2 = grp.Sum(r => r.Field<int>("Order number"))  
      }; 

foreach(var item in query) 
{ 
    resultDataTable.Rows.Add(item.Id, item.Sum, item.Sum2); 
} 

В результате DataTable с 3 колонками. Первый - это имя и фамилия, второй - номер, а третий - номер.

Любые идеи, почему это не работает?

+2

Вы можете указать, какое значение именно 'null' в отладчике? Это значение какого-то поля? –

+1

Вы пытались использовать ToList()? Подобно этому выберите новый {...}. ToList() –

+2

Проведите проверку работоспособности, посмотрите, есть ли у результата 'result' какие-либо значения, и если они правильно перечислены. – MPelletier

ответ

0

Я предполагаю, что вы создали исходную таблицу так же, как и таблицу назначения, добавив столбцы вручную. Тогда я предполагаю, что они также содержали String-столбцы вместо столбцов int. Обратите внимание, что по умолчанию String.

Так следующее создает и добавляет три столбца типа строки:

resultDataTable.Columns.Add("User ID"); 
resultDataTable.Columns.Add("Amount"); 
resultDataTable.Columns.Add("Order number"); 

Вместо использования перегрузки:

resultDataTable.Columns.Add("User ID"); 
resultDataTable.Columns.Add("Amount", typeof(int)); 
resultDataTable.Columns.Add("Order number", typeof(int)); 

Почему это так важно? Потому что вы в противном случае не можете использовать Sum = grp.Sum(r => r.Field<int>("Amount")), так как этот тип столбца не int, а string, и вы получите время выполнения InvalidCastException в Field на foreach. Возможно, у вас есть пустой try...catch где-то, что проглатывает это исключение и его следует избегать.

Лучший способ для создания таблицы и столбцы, если таблица назначения имеет те же столбцы, чтобы использовать DataTable.Clone:

DataTable resultDataTable = result.Clone(); // same columns but empty 
+0

Благодарим вас за ответ. К сожалению, это не работает :((я использовал теперь .Clone()). Я создаю результат DataTable с общим URL-адресом синтаксического анализатора: http://www.codeproject.com/Articles/11698/A-Portable-and-Efficient-Generic -Parser-for-Flat-F с помощью GenericParserAdapter и result = parser1.GetDataTable(); данные взяты из файла .CSV. – Bronchi

+0

@Bronchi: я все еще думаю, что вы не используете столбцы 'int' в исходной таблице , если он генерируется из синтаксического анализатора, синтаксический анализатор не будет знать, что это значение 'int'. Вы должны сами проанализировать его и использовать' int.Parse' для получения значения 'int' из csv -value, тогда вы можете суммировать значения, вы не можете суммировать строки. Однако вы получите исключение во время выполнения в 'r.Field ', если столбец имеет строку типа. –

+0

Я проверил это, добавив значения по я сам столбец в DataTable, и это действительно проблема. Спасибо, что указали это. Я попытаюсь проанализировать данные из csv самостоятельно или каким-то образом изменить строковые значения t o int в этих двух столбцах. – Bronchi

Смежные вопросы