我有一个应用程序,在 Mac 上使用 Monotouch/C# 作为前端,从后端 VS2010 中的 WCF 服务中提取数据。昨晚我离开前一切都像做梦一样顺利,而今天,我不确定发生了什么。我所看到的是,这是来自 Monotouch 的 linq 内部的一个异常,看起来我做的一切都很好,因为我在过去几天里没有碰过这段代码。
当我得到一个GetAllStaffResult
从 WCF 返回对象,我回到主线程,然后调用此方法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 源文件,以便我可以看到这些行。
Oh, this
is a GetAllStaffResult
,上面的方法是一个分部类,其中包含一系列员工、特许经营权、地点。 populate 方法获取每位员工并根据员工的特许经营 ID 填充特许经营的名称。我这样做是因为我要返回大约 500 名具有长特许经营名称的员工,并且我可以通过自己在客户端重建对象图来节省带宽。
因为数据库中存在外键关系,所以我 100% 确定 Single 总是会返回结果。 First() 也给了我同样的问题。
编辑:堆栈跟踪是针对我在 Single() 方法之后尝试的 First() 方法。我现在正在检查源代码,将报告我的发现。