在Visual Studio 2010使用数据服务进行映射

Categories: Data, Visual Studio
Tags: No Tags
Comments: No Comments
Published on: 2010 年 05 月 11 日

 

[原文作者]:Beth Massi

[原文链接]:Sharing the goodness that is VB

 

    从Visual Studio 2008 Service Pack 1开始,您可以通过创建ADO.NET数据服务很容易的接触到REST风格的Web服务数据模型。所以如果您正想着搭建一个CRUD的远程数据访问层,那么这可能是你正在使用或者正在寻求的一门技术,我写了很多关于关于在VS2008的数据服务,我最喜欢的是:

针对Visual Studio 2010 和 the .NET Framework 4,我们已经将这门技术的名称改为WCF数据服务, 并且增加了一些新的特征, 其中之一就是我在这想谈的查询映射, 但是首先……

什么是查询规划?

    如果您一直在LINQ查询那么你可能已经写过很多的映射,一个映射,可以用来限制返回的成员集数量的属性,或者用来执行属性的转换,可以有选择的做到的这些。例如:我是有一个负有12个属性特征的的客户名单,但我只想在我的结果集合里显示他们夫妇的名单。我这样写:

Dim result = From c In customerList Select c.CustomerID, c.ContactName

    这将产生一个只有CustomerID和ContactName属性的匿名列表,我们说,这个查询将Customer的属性映射到匿名的类型中。你也可以将自己的结果映射到已经的类型中。例如,假设我有一个拥有两个属性特这的MyCustomer类:

Class MyCustomer

Property CustomerID As Integer

Property ContactName As String

End Class

    我也这样写这个查询来替代,以便它可以将结果映射到MyCustomer这个类的对象集中:

Dim result = From c In customerList

Select New MyCustomer With

{.CustomerID = c.CustomerID,

.ContactName = c.ContactName}

数据服务支持查询映射

    当你写一个针对数据服务的查询它将转化为一个HTTP GET调用,你可以使用LINQ数据查询服务来执行约束(Where)、排序(Order by)以及其他的一些基本表达,尽管不是支持所有的LINQ语法。遗憾的是在Visual Studio 2008 SP1中你不能使用一个查询映射(Select)到数据服务,你会得到一个NotSupportedException的错误信息,这意味着你所有在数据服务背后定义的实体模块的属性都被返回了。如果你有带有许多属性的实体或者属性中含有超负荷的属性,比如图片,或者其他一些二进制的数据,这或许是一个障碍。无论你用不用它们,所有这些都要被设置最低限。让我来告诉你我的意思:

我有一个的Northwind数据库,通过它来揭露.NET 3.5 SP1的数据服务。就像我们在以前的帖子建立实体框架模型。它具有分类和产品的实体。该类别的实体有一个Picture属性,但我不需要在我的客户端应用程序使用它。我已经添加到客户服务的引用,你会认为我们以下内容可以这么写吗:

Dim svc As New NorthwindService.NorthwindEntities(New Uri("http://…/NorthwindService.svc/"))

‘Try to project just the properties we need:

Dim result = From c In svc.Categories Select c.CategoryID, c.CategoryName

For Each c In result ‘NotSupportedException when query executes

Console.WriteLine(c)

Next

    然而,我们得到一个运行时错误“选择不支持”,为了规划属性,我们只要执行查询和降低本地数据。然后突出那个清单,我们只需要像这样增加一个调用去扩展ToList方法:
Dim result = From c In svc.Categories.ToList Select c.CategoryID, c.CategoryName

不幸的是如果你在有效载荷查看所有返回的属性,虽然结果是我们想要的,但是确实最低效的,在我们的例子中,你可以看到图片的二进制数据返回,但从来没有使用过:

clip_image002

    我们真正想要的仅仅是在有效载荷里我们要求的那部分属性,幸运的是这些已经在Visual Studio 2010 和 .NET Framework 4中被支持了,另外你也可以在.NET 3.5中安装一个更新来获得这项支持,我们先通过在Visual Studio 2010中创建一个WCF数据服务工程来体验一下这个新特性吧。

Visual Studio 2010创建新的WCF数据服

    自从设计师在VS2008上做了一些微妙的改变后,我迫不及待的想要在VS2010上创建一个WCF数据服务。创建一个新的项目并选择网络节点,然后选择ASP.NET Web应用程序空。如果你没有看到它,请确保您的目标设置为.NET框架4。这是一个新的项目模板,以方便使用,特别是如果您创建数据服务。

clip_image004

    单击确定,创建项目。它将只包含一个web.config文件。接着像以前一样添加数据模型,因为我想使用实体框架,选择工程文件 à添加新项,选择数据节点,然后选择ADO.NET实体数据模型,单击添加就完成你的数据模型的创建了。依我而言,我从Northwind数据库中生成它。

    接下来,我们需要添加WCF的数据服务(前身是闻名的ADO.NET数据服务)。项目à “添加新项”,选择网络节点,然后向下滚动并选择WCF的数据服务。在试图寻找到它之前请确信此项目模板改名为.NET 3.5和4.0框架:

clip_image006

    现在,您可以设置您的实体访问。在这个例子中,我将在模型中访问所有的实体模型:

Public Class NorthwindService
    ' TODO: replace [[class name]] with your data class name
    Inherits DataService(Of NorthwindEntities)
 
    ' This method is called only once to initialize service-wide policies.
    Public Shared Sub InitializeService(ByVal config As DataServiceConfiguration)
        ' TODO: set rules to indicate which entity sets and service operations are visible, updatable, etc.
        ' Examples:
        config.SetEntitySetAccessRule("*", EntitySetRights.AllRead)
        ' config.SetServiceOperationAccessRule("MyServiceOperation", ServiceOperationRights.All)
        config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2
    End Sub
 

End Class

    最后,我们将添加一个简单的客户端控制台应用程序的解决方案测试服务。文件à添加à新建项目,然后选择控制台应用程序。右键单击控制台应用程序的客户端,然后选择“添加服务引用”在Solution Explorer。当打开对话框单击按钮,应探索找到数据服务。命名服务引用,然后单击确定。这将自动生成客户端代理和必要的实体来配合我们的数据服务。

使用WCF数据服务映射

    现在我们拥有一个.NET 4.0的WCF数据服务体制,我们可以在客户端写一个指定映射查询:

Dim svc As New NorthwindEntities(New Uri("http://.../NorthwindService.svc/"))
 
'Projections now supported in WCF Data Services 
Dim result = From c In svc.Categories Select c.CategoryID, c.CategoryName
 
For Each c In result 'No errors 
    Console.WriteLine(c)
Next
 
这意味着和以前不允许指定一个select参数相反,现在数据服务被支持了。如果你想用你喜欢的浏览器打开你的刚建好的WCF数据服务,您可以在查询字符串中指定一个查询分句:
http://…/NorthwindService.svc/Categories?$select=CategoryID,CategoryName
 

    现在如果你去查看有效负载,我们可以看到,只有CategoryID,CategoryName从服务端返回回来,这样就保护了系统资源。

clip_image008

    欲了解更多有关使用数据服务查询映射信息,请参阅MSDN LibraryWCF Data Services Team Blog

No Comments - Leave a comment

Leave a comment


Welcome , today is 星期六, 2017 年 02 月 25 日