Silverlight 4.0 具有客户端过滤的Silverlight RIA查询

Silverlight 4.0 具有客户端过滤的Silverlight RIA查询,silverlight-4.0,ria,wcf-ria-services,Silverlight 4.0,Ria,Wcf Ria Services,我有以下返回空的查询(枚举未产生任何结果): 相反,我必须像使用常规SL WCF服务一样执行以下操作: var qry = _ctx.GetStudentByIDQuery(studentId); var load = _ctx.Load(qry); load.Completed += (s, e) => { CurrentStudent = _ctx.Students.FirstOrDefault(); dataForm1.CurrentItem = CurrentStu

我有以下返回空的查询(枚举未产生任何结果):

相反,我必须像使用常规SL WCF服务一样执行以下操作:

var qry = _ctx.GetStudentByIDQuery(studentId);
var load = _ctx.Load(qry);
load.Completed += (s, e) =>
{
    CurrentStudent = _ctx.Students.FirstOrDefault();
    dataForm1.CurrentItem = CurrentStudent;
    BeginEdit();
};
为什么第一种方法不起作用?服务器端查询执行与第一个查询相同的按ID过滤,因此它不是查询本身。我所看到的使用RIA的示例中没有一个使用完整的事件处理程序;RIA应该在幕后处理异步加载。有什么好处

编辑 我想把问题的焦点再集中一点。下面是我的另一个查询,它的工作原理与您预期的一样:

var query = ctx.GetStudentsWithAdultContactsQuery();
studentDataGrid.ItemsSource = ctx.Students;
ctx.Load(query);

我在这里没有显式地处理完成的回调,这就是我在web示例中使用RIA的方式,包括。因此,这个查询与不起作用的查询之间的明显区别在于(a)过滤和(b)数据绑定目标。但为什么两者都要有所作为呢?

我想我已经找到了一个答案:

绑定网格和绑定数据表单这两种情况是不同的,因为在前一种情况下,我绑定到一个
实体集
(学生),而在数据表单的情况下,我绑定到一个单独的实体(学生)。嗯,嗯!那又怎样

因此,
EntitySet
实现了
INotifyCollectionChanged
,当实体添加到集合中时(如查询返回结果时),会引发一个通知事件,导致网格更新。另一方面,数据表单
CurrentItem
未绑定到
EntitySet
,因此它不监听Students集合中的更改,也不知道CurrentStudent何时不再为null。因此,我必须等待加载完成,或者我可以做一些网格可能会做的事情,然后收听Students集合,其效果相同:

var qry = _ctx.GetStudentsWithAdultContactsQuery().Where(s => s.StudentID == studentId);
_ctx.Load(qry);
_ctx.Students.EntityAdded += new EventHandler<EntityCollectionChangedEventArgs<Student>>(Students_EntityAdded);
//...
void Students_EntityAdded(object sender, EntityCollectionChangedEventArgs<Student> e)
{
    dataForm1.CurrentItem = e.Entity;
}

我将问题标记为已回答,但如果与我的解释不同,欢迎发表您的解释;如果它提供了新的见解,我会很高兴地投票支持它。

我可能应该提到我正在使用LinqtosQldomainServices。你是说你必须在服务端这样做吗?不,在两个示例中,代码都在客户端上。在第二个示例中,服务器上只有筛选(SingleOrDefault(s=>…),但这可能会混淆问题。我只是不确定为什么我必须处理回调,因为我认为RIA为您处理异步回调,或者至少在大多数情况下它似乎就是这样做的。
var qry = _ctx.GetStudentsWithAdultContactsQuery().Where(s => s.StudentID == studentId);
_ctx.Load(qry);
_ctx.Students.EntityAdded += new EventHandler<EntityCollectionChangedEventArgs<Student>>(Students_EntityAdded);
//...
void Students_EntityAdded(object sender, EntityCollectionChangedEventArgs<Student> e)
{
    dataForm1.CurrentItem = e.Entity;
}
var qry = _ctx.GetStudentsWithAdultContactsQuery();
_ctx.Load(qry.Where(s => s.StudentID == studentId));
_ctx.Students.EntityAdded += (s, e) => {
    dataForm1.CurrentItem = e.Entity;
};