我有一个应用程序在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]
}
Run Code Online (Sandbox Code Playgroud)
这是堆栈跟踪:
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)
Run Code Online (Sandbox Code Playgroud)
不确定是什么导致这个...任何人都有任何想法?去看看我是否能找到MT源文件,这样我才能看到这些行.
哦,this是的GetAllStaffResult,上面的方法是一个部分类,有一系列的工作人员,特许经营权,地点.populate方法接受每个工作人员并根据工作人员的特许经营权ID填写特许经营权的名称.我这样做是因为我回来了500名具有长特许经营名称的员工,我通过在客户端重建对象图来节省带宽.
因为数据库中存在外键关系,所以我100%确定Single将始终返回结果.First()也给了我同样的问题.
编辑:堆栈跟踪是我在Single()方法后尝试的First()方法.我现在正在检查源代码,将报告我的发现.
我正在使用MT.D列出DialogViewController中的人员.EnableSearch已启用,您可以过滤列表中的项目.但是,如果您推送到另一个视图,然后返回,搜索栏将为空.我能够恢复通过覆盖OnSearchTextChanged (string text)并将字符串存储到本地字段所使用的搜索查询,当视图重新聚焦时,我使用以下代码:
public override ViewDidAppear (bool animated)
{
base.ViewDidAppear (animated);
if (EnableSearch && !string.IsNullOrWhiteSpace (lastSearchQuery))
{
this.SearchButtonClicked (lastSearchQuery); // this inserts text
this.StartSearch (); // no clue what this is doing
this.ReloadData (); // does nothing but was worth a try
}
}
Run Code Online (Sandbox Code Playgroud)
该代码将文本插入搜索栏并显示它,但除非您输入内容,否则我无法过滤它.键盘进入视图,有一个搜索按钮,但它什么也没做.有什么建议?