LoadAsync需要DataServiceQuery的原因是普通IQueryable没有定义执行查询的异步方式。该方法将IQueryable类型作为其参数的原因是,用户不必显式地将查询对象强制转换为DataServiceQuery(使代码更短),而且由于我们假设用户将尝试至少运行一次代码,因此他们会立即看到错误(如您所做)。
LoadAsync只支持异步操作,因此需要DataServiceQuery。如果已经有了结果(无需执行异步请求),则可以调用Load方法。这是你第二个问题的答案。不必在设计时和运行时都调用LoadAsync,您可以在设计时使用Load,在运行时使用LoadAsync。但是由于跟踪限制,您可能需要以不同的方式创建DataServiceCollection。
像这样:
DataServiceCollection<Task> dsc;
DataServiceQuery<Task> dsq = _tasksModel as DataServiceQuery<Task>;
if (dsq != null)
{
dsc = new DataServiceCollection<Task>();
dsc.LoadAsync(dsq);
}
else
{
dsc = new DataServiceCollection<Task>(myDataServiceContext);
dsc.Load(_tasksModel);
// Invoke the LoadAsyncCompleted handler here
}
如果在caling Load之前将DataServiceContext传递给构造函数,那么将跟踪实体(就像LoadAsync情况一样)。如果不需要,可以调用采用IEnumerable和TrackingMode的构造函数并关闭对它的跟踪。