我继承了这个代码,该代码接受IEnumerable并对其执行一系列选择,然后在执行选择后尝试在剩余记录上调用Sum。代码读作:
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。
错误是尝试将小数转换为long,并且在迭代器上调用由三个Select调用产生的Sum时,似乎发生了StackTrace。
堆栈跟踪是:
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()
选择返回迭代器,似乎没有任何方法可以准确计算选择的结果。
有趣的是,如果记录为空,则调用Sum只返回零并且不会抛出错误。
答案 0 :(得分:0)
你想要求整数或小数吗?使用适当的Generic类型,并在必要时转换结果。有关重载列表,请参阅http://msdn.microsoft.com/en-us/library/system.linq.enumerable.sum.aspx。
答案 1 :(得分:0)
我想出来了。 Stack Trace具有误导性。
问题在于在我的代码中构建RowInfo对象... RowID是一个long,并且属性将其值设置为的变量是小数。
我认为Sum调用中发生了错误,因为延迟加载在完成调用并且需要数据之前没有完成属性的设置。