2013-08-05 4 views
0

Я унаследовал этот код, который принимает IEnumerable и выполняет серию Select на нем, а затем пытается вызвать Sum на оставшиеся записи после выполнения Selects. Код выглядит следующим образом:Странная ошибка при строковых вызовах Linq

var totalrecs = records.Select(row => new RowInfo(RowID = row.RowID, SomeData = row.SomeData}) 
.Select(ri => new {RowInfo = ri, XMLData = GetXMLFileForRecord(ri)}) 
.Select(data => ParseAndUpdateRecords(data.RowInfo, data.XmlData)) 
.Sum(); 

где 'records' - IEnumerable.

Ошибка при попытке конвертировать десятичную дробь в длинную и из StackTrace, по-видимому, возникает при вызове суммы на Iterator, которая возникает в результате трех вызовов Select.

Трассировка стека является:

Exception:Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: Cannot implicitly convert type 'decimal' to 'long'. An explicit conversion exists (are you missing a cast?) 
at CallSite.Target(Closure , CallSite , Object) 
at RecordCapture.Controller.<CaptureAndUpdateRecords>b__10(Object row) 
at System.Linq.Enumerable.<>c__DisplayClass12`3.<CombineSelectors>b__11(TSource x) 
at System.Linq.Enumerable.<>c__DisplayClass12`3.<CombineSelectors>b__11(TSource x) 
at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext() 
at System.Linq.Enumerable.Sum(IEnumerable`1 source) 
at RecordCapture.Controller.CaptureAndUpdateRecords() 
at RecordCapture.Controller.<Start>b__1() 
StackTrace: at CallSite.Target(Closure , CallSite , Object) 
at RosterCapture.Controller.<CaptureAndUpdateRosters>b__10(Object row) 
at System.Linq.Enumerable.<>c__DisplayClass12`3.<CombineSelectors>b__11(TSource x) 
at System.Linq.Enumerable.<>c__DisplayClass12`3.<CombineSelectors>b__11(TSource x) 
at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext() 
at System.Linq.Enumerable.Sum(IEnumerable`1 source) 
at RecordCapture.Controller.CaptureAndUpdateRecords() 
at RecordCapture.Controller.<Start>b__1() 

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

Интересно, что если записи пусты, вызов Sum просто возвращает ноль и не выдает ошибку.

+0

Если вы хотите получить счет, который вы могли бы назвать .Count() вместо .Sum() –

ответ

0

Я понял это. Трассировка стека вводила в заблуждение.

Проблема заключалась в создании объекта RowInfo в моем коде ... RowID был длинным, а переменная, которую свойство задавала для значения, была десятичной.

Я считаю, что ошибка произошла в вызове Sum из-за ленивой загрузки, когда настройка атрибутов не была выполнена до тех пор, пока этот вызов не был сделан, и данные были необходимы.

+0

Значит, вы решили это с литой? –

0

Вы хотите суммировать целые числа или десятичные знаки? Используйте подходящий тип Generic и приведите результат, если это необходимо. См. http://msdn.microsoft.com/en-us/library/system.linq.enumerable.sum.aspx для списка перегрузки.

+0

В примере, который я дал, Sum вызывается в Iterator. Ссылка, которую вы указали, делает это в простом списке int. Я не понимаю, как это помогает. Можете ли вы дать убедительный пример того, как вы это сделаете в коде, который я предоставил? – jpaull

+0

Сумма указывает, что вы берете Перечислимый тип некоторого типа числового значения и добавляете их вместе. Вы не можете так сказать «Итератор». Каков тип значений, которые вы пытаетесь суммировать? Если ответ не является числовым типом, то вы не делаете с вашим кодом то, что, по вашему мнению, вы делаете. –

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