MonoTouch & LINQ - 由于对象的当前状态,操作无效
Posted
技术标签:
【中文标题】MonoTouch & LINQ - 由于对象的当前状态,操作无效【英文标题】:MonoTouch & LINQ - Operation is not valid due to the current state of the object 【发布时间】:2012-02-14 08:27:46 【问题描述】:我有一个应用程序,它在 Mac 上使用 Monotouch/C# 作为前端,从后端的 VS2010 中的 WCF 服务中提取数据。昨晚在我离开之前,一切都像梦一样工作,而今天,我不确定发生了什么。我只能看到这是来自 Monotouch 的 linq 中的一个异常,看起来我做的一切都很好,因为我在过去几天没有接触过这段代码。
在我从 WCF 得到一个 GetAllStaffResult
对象后,我让自己回到主线程,然后调用这个方法 Populate()
:
public void Populate()
foreach (var m in Staff)
m.FranchiseName = this.Franchises.Single(f => f.ID == m.FranchiseID).Name;
[snip]
这是堆栈跟踪:
System.InvalidOperationException: Operation is not valid due to the current state of the object.
at System.Linq.Enumerable.First[FranchiseListingItem] (IEnumerable'1 source, System.Func2 predicate, Fallback fallback) [0x0004a] in /Developer/MonoTouch/Source/mono/mcs/class/System.Core/System.Linq/Enumerable.cs:816
at System.Linq.Enumerbale.First [FranchiseListingItem] (IEnumerable'1 source, System.Func2 predicate) [0x00007] in /Developer/MonoTouch/Source/mono/mcs/class/System.Core/System.Linq/Enumerable.cs:843
at ADMobileServices.BOTransferDTOs.GetAllStaffResult.Populate() [0x0003b] (my code)
不确定是什么原因造成的……有人有什么想法吗?去看看我能不能找到 MT 源文件,这样我就可以看到那些行了。
哦,this
是一个GetAllStaffResult
,上面的方法是一个分部类,它有一组员工、特许经营权、位置。 populate 方法获取每个员工并根据员工的特许经营 ID 填充特许经营的名称。我这样做是因为我要返回 500 名具有长特许经营权的员工,而且我通过自己在客户端重建对象图来节省带宽。
因为数据库中存在外键关系,所以我 100% 确定 Single 总是会返回结果。 First() 也给了我同样的问题。
编辑:堆栈跟踪是针对我在 Single() 方法之后尝试的 First() 方法。我现在正在查看源代码,将报告我的发现。
【问题讨论】:
【参考方案1】:如果序列为空,就会发生这种情况。
【讨论】:
你是对的。似乎我排除了一个测试特许经营实体,我忘记将它们从员工列表中排除。谢谢!以上是关于MonoTouch & LINQ - 由于对象的当前状态,操作无效的主要内容,如果未能解决你的问题,请参考以下文章