Я унаследовал этот код, который принимает 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 просто возвращает ноль и не выдает ошибку.
Если вы хотите получить счет, который вы могли бы назвать .Count() вместо .Sum() –