RIA服务 - Silverlight 4.0 - 从代码访问实体

时间:2010-08-25 12:55:10

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

我有一些奇怪的情况我有一个简单的项目来测试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

1 个答案:

答案 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是提示者选择的变量名。*