使用客户端过滤的Silverlight RIA查询

时间:2011-01-24 00:30:02

标签: silverlight-4.0 ria wcf-ria-services

我有以下查询返回空(枚举没有结果):

CurrentStudent = _ctx.Students.SingleOrDefault();
var qry = _ctx.GetStudentsWithAdultContactsQuery(); 
_ctx.Load(qry.Where(s => s.StudentID == studentId));
dataForm1.CurrentItem = CurrentStudent;
BeginEdit();

相反,我必须执行以下操作,就像我使用常规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的例子都没有使用Completed事件处理程序; RIA应该在幕后处理异步加载。是什么给了什么?

修改的 我想重新调整一下这个问题。这是我的另一个查询,它可以像您期望的那样工作:

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

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

2 个答案:

答案 0 :(得分:1)

答案 1 :(得分:0)

我想我已经找到了答案:

两种情况 - 绑定网格和绑定数据形式 - 是不同的,因为在前一种情况下我绑定到EntitySet(学生),而在数据形式的情况下,我绑定到一个人实体(学生)。好吧,呃!但那又怎么样?

因此,EntitySet实现INotifyCollectionChanged,当实体添加到集合时(如查询返回结果时)会引发通知事件,从而导致网格更新。另一方面,数据形式CurrentItem不绑定到EntitySet,因此它不会收听Students集合中的更改,也不知道CurrentStudent何时不再为null。因此,我必须等待负载完成,或者我可以做网格可能做的事情,并听取学生集合,这同样有效:

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;
};

我将问题标记为已回答,但如果与我的不同,请发表您的解释。如果能提供新的见解,我会很乐意投票。