WCF Data Service的常规使用——使用存储过程、侦听器(2)
使用存储过程
有时候,使用表及视图不能满足业务需求,因此可能需要将存储过程通过WCF Data Service暴露出来。
1、在数据库中新建一个存储过程,这里使用默认架构dbo,名称为QureyProduct。
CREATE PROCEDURE QureyProduct @Color nvarchar(50) AS BEGIN Select ProductID, Name from Production.Product where Color = @Color END GO
这个存储过程用来按颜色查询产品。
2、打开数据关系模型文件AdventureWorksModel.edmx,在模型浏览器AdventureWorksEntities下选择函数导入。
获取列信息选择创建新复杂类型,在“返回一下内容的集合”中选择复杂。
如果从存储过程的返回值与模型文件中现有的实体一致,可以选择实体选项;同样存储过程返回单值则使用标量;无返回值则使用无选项。
导入成功后的结果如下:
3、在WcfDataService.svc.cs中添加一个方法,用于暴露刚刚导入的存储过程。
[WebGet] public IQueryable<QureyProductResult> QureyProduct(string color) { if (string.IsNullOrEmpty(color)) { throw new ArgumentNullException("color", "You must provide a color."); } var products = this.CurrentDataSource.QureyProduct(color); return products.AsQueryable(); }
方法返回值为IQueryable<T>,用以兼容OData的查询规范
4、运行服务,可以在浏览器中用下面的URL进行测试:
http://localhost:45669/WcfDataService.svc/QureyProduct?color='Red'&$filter=ProductID le 730
地址中color为接口方法中的需求的参数,后面的$filter依然是OData的标准查询参数。但不可以使用$orderby、$inlinecount、$skip和 $top参数。
对于查询,根据Rest的约定,通常使用GET方法,因此方法用[WebGet]标注;对于其他操作,则使用[WebInvoke]标注。
更多的内容可以参看:http://msdn.microsoft.com/zh-cn/library/cc668788.aspx
使用侦听器
如果需要在操作前插入一段自定义的代码,需要使用侦听器。比如数据集中包含了历史上的所有数据,但业务只关心最近3年的数据,则可以在侦听器方法中做出条件限制。下面实现一个查询监听器。
1、在WcfDataService.svc.cs中添加一个方法,并使用[QueryInterceptor("实体类名")]标注。
[QueryInterceptor("Product")] public Expression<Func<Product, bool>> OnQueryProduct() { return p => p.SellStartDate >= new DateTime(2002, 1, 1); }
通过上面的侦听器,实现了将2002年以前上市的老产品从结果集中过滤出去的需求。
2、运行服务,用以下URL测试查询
http://localhost:45669/WcfDataService.svc/Product?$top=10&$orderby=Name
侦听器分为两种查询侦听器和变更侦听器,对应数据的查询和增删改,分别用[QueryInterceptor(EnitySetName)]
和[ChangeInterceptor(EnitySetName)]标注。
侦听器方法不能包含参数,其中查询侦听器需要返回一个Expression<Func<T,bool>>类型的lambda表达式;变更侦听器返回为void。
更多关于侦听器的内容可以参看:http://msdn.microsoft.com/zh-cn/library/dd744842.aspx
下篇,概要描述如何使用客户端代码访问WCF Data Service服务。