弦乐Linq调用的奇怪错误

时间:2013-08-05 13:32:01

标签: iterator sum ienumerable

我继承了这个代码,该代码接受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只返回零并且不会抛出错误。

2 个答案:

答案 0 :(得分:0)

你想要求整数或小数吗?使用适当的Generic类型,并在必要时转换结果。有关重载列表,请参阅http://msdn.microsoft.com/en-us/library/system.linq.enumerable.sum.aspx

答案 1 :(得分:0)

我想出来了。 Stack Trace具有误导性。

问题在于在我的代码中构建RowInfo对象... RowID是一个long,并且属性将其值设置为的变量是小数。

我认为Sum调用中发生了错误,因为延迟加载在完成调用并且需要数据之前没有完成属性的设置。