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下选择函数导入。

image

获取列信息选择创建新复杂类型,在“返回一下内容的集合”中选择复杂。

如果从存储过程的返回值与模型文件中现有的实体一致,可以选择实体选项;同样存储过程返回单值则使用标量;无返回值则使用无选项。

导入成功后的结果如下:

image

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服务。

posted @ 2011-04-08 13:53  宽厚  阅读(1126)  评论(0编辑  收藏  举报