我有一些奇怪的情况我有一个简单的项目来测试Silverlight 4.0中的RIA功能。
当我使用域服务的数据源时,它工作得很好但是当我想从代码访问Context并执行简单查询时,我返回0行。
//test One with query provided to DataSource
var q = ctx.GetDoctorsWithPatientsAndHospitalQuery();
var result = ctx.Load(q);
//test Two using EntityQuery
EntityQuery<Doctor> query =
from c in ctx.GetDoctorsWithPatientsAndHospitalQuery()
select c;
LoadOperation<Doctor> loadOp = this.ctx.Load(query);
var result2 = loadOp.Entities;
//test Three using only entity and Linq
var result3 = ctx.Doctors.ToList();
奇怪的是,当我想从代码中添加新的实体实例时,效果很好。
Doctor newDoctor = new Doctor()
{
FirstName = firstNameTextBoxNew.Text,
LastName = lastNameTextBoxNew.Text,
Hospital_Id = tmp,
Hospital = tmpH
};
ctx.Doctors.Add(newDoctor);
ctx.SubmitChanges();
任何人都可以指出我从代码执行select时做错了吗?
此致 DanielSkowroński
答案 0 :(得分:3)
调用“LoadOperation loadOp = this.ctx.Load(query);”代码是一个异步操作,所以你基本上在结果完成之前检查结果。
如果要查看结果,则需要为Load()方法提供一个回调,该回调将在加载数据后执行。
域服务的数据源处理异步更新,因此请在加载操作完成时继续传播更改。
您的“保存”有效,因为它不会等待结果。您之后手动检查数据库。没有在代码中检查它。
希望这有帮助。
快速检查,试试这个(“result2 =”行的断点)。在此示例中,您的loadOp是多余的,但我不想太多地更改您的代码:
LoadOperation<Doctor> loadOp = this.ctx.Load(query, loadOperation =>
{
var result2 = loadOp.Entities;
}, null);
**注意:对于那些想要编辑此代码的人......请不要。我想保留提问者代码的味道。 loadOp和loadOperation指向同一个对象,result2是提示者选择的变量名。*