2012-03-06 2 views
0

Я использую следующий код, чтобы получить результат формы dataTable, но при использовании результирующего запроса в цикле foreach он выдает исключение: «Невозможно наложить объект типа« System.Int64 »на тип ' System.String '». Сообщите мне, где у меня ошибка в коде.Итерационный результат запроса Linq

var query = from detailRow in dtDetail.AsEnumerable() 
group detailRow by detailRow.Field<string>("Domain") into grouping 
select new 
{ 
    Domain = grouping.Key, 
    Impressions = grouping.Count(), 
    Clicks = 
    grouping.Sum(detailRow => int.Parse(detailRow.Field<string>("Clicks").ToString())), 
    url = grouping.First<DataRow>() 
}; 

foreach (var detailRowGroup in query) 
{ 
    console.wirteline(detailRowGroup.Domain + detailRowGroup.Impressions + detailRowGroup.Clicks + detailRowGroup.url); 

} 

ответ

0

Я решил проблему и обнаружил, что у меня были две ошибки в моем коде. Это были;
1. Я использовал String на месте Int64. Заменив String на Int64, исправлена ​​ошибка.
2. Для DBNULL я использовал, если условие.
Ниже приведена строка кода;

Clicks = grouping.Sum(detailRow => Int64.Parse(detailRow.IsNull("Clicks") ? "0" : detailRow.Field<Int64>("Clicks").ToString())), 

Thanks Steven and Steve Haigh.

1

dtDetail Вашего DataTable содержит столбец, названный Click, который содержит значение типа Int64, в то время как вы пытаетесь восстановить его как String. Проблема заключается в том, в следующей строке:

int.Parse(detailRow.Field<string>("Clicks").ToString()) 

изменить его на:

int.Parse(detailRow.Field<Int64>("Clicks").ToString()) 
+0

Спасибо, Стивен, в этом была проблема. Но теперь есть другая проблема, то есть значений dbnull. Хотя система пытается разобрать нулевое значение, оно вызывает исключение, не знает, как с ним справиться. –

+0

Вы можете сделать 'detailRow.Field (« Clicks »)' (при этом с '?'). – Steven

1

Не зная о ваших данных, трудно сказать, но я думаю, что ваша колонка Переходов числовой, так что вы хотел бы, чтобы параметр типа находился в long (64-битный int)?

I.e.

detailRow.Field<long>("Clicks") 

возможно?

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

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