当前位置: 首页 > web开发 > Silverlight > 正文

使用LINQ和ADO.NET创建Silverlight程序(4)

时间:2011-10-23 51CTO 黄永兵 译

查询数据只是解决方案的一部分,我们的最终目标是同时支持查询和更新,为了支持这些要求, ADO.NET Data Service映射了四个最基本的数据访问操作到基本的HTTP动词(如表1所示):

数据访问动词 HTTP动词
Create POST
Read GET
Update PUT
Delete DELETE

表 1 数据访问动词 vs HTTP动词

通过使用这些动词,ADO.NET Data Service让服务的用户可以利用所有的数据操作类型,而不用为不 同类型创建专门的端点。使用ADO.NET Data Service更新数据的唯一要求是在数据访问技术下支持 Iupdatable接口,这个接口定义了如何从ADO.NET Data Service更新和传播到数据源。

Silverlight 2.0客户端库

如果你使用ADO.NET Data Service通过URI语法和操作XML来进行查询和更新数据,你可能会得到你想 要的许多功能,但你仍然要自行构建一些管道,ADO.NET Data Service客户端库的引入就是要解决这个问 题,这个库允许你直接在Silverlight程序中进行LINQ查询,由客户端库将LINQ查询翻译成HTTP查询或更 新请求。

首先,你需要生成一些代码,这些代码读取ADO.NET Data Service服务的元数据,并为服务的实体生 成数据类。

为了生成这些代码,你需要在你的项目(Project)中添加Service Reference,你可以在项目资源管 理器(Project Explorer)中Silverlight项目上点击右键,然后选择‘添加服务引用(即Add Service Reference)’,在弹出的对话框中点击‘查找(Discover)’按钮,显示你项目中的服务(包括ADO.NET Data Service),选择ADO.NET Data Service端点,点击确定按钮。这样会创建一个新的文件,包含了每 个端点对应的data contract类和一个DataServiceContext衍生类,DataServiceContext类用作服务接入 点(暴露可查询的服务端点),这样会在你的Silverlight项目中包含这些类,并在 System.Data.Services.Client.dll(Silverlight 2 SDK的一部分)中添加一个引用。Silverlight客户 端代码和其它使用.NET的代码基于LINQ的查询非常相似,下面是示例代码:

// 创建服务类指定ADO.NET Data Service的位置
 NorthwindEntities ctx =
 new  NorthwindEntities(new Uri("Products.svc", UriKind.Relative));
//创建LINQ查询
var  qry = from p in ctx.Products
        orderby p.ProductName
         select p;

当你执行这个查询时,它会直接向目标数据发送一个Web请求,但这里的Silverlight代码和标准的 LINQ查询不同,在Silverlight中不允许同步Web请求,因此,如果要执行异步,你首先需要将查询转换成 DataServiceQuery对象,然后再调用BeginExecute启动异步执行:

// 创建一个DataServiceQuery,因为查询返回的是Products
DataServiceQuery productQuery =
  (DataServiceQuery)qry;
//指定一个callback函数执行异步查询
 productQuery.BeginExecute(new
   AsyncCallback(OnLoadComplete),
  productQuery);

当这些查询执行完后,无论操作是否成功,在AsyncCallback中指定的方法都会执行,通常你会在 AsyncCallback中包含原始查询,因此可以在callback方法中检索它,你也可以将其保存为类的一部分, 正如你在例3中看到的: