VB 2010 的自动属性, 集合初始化器以及隐线连续支持

[原文作者]:Scott Gu

[原文链接]:Automatic Properties, Collection Initializers, and Implicit Line Continuation support with VB 2010

【除了博客, 我现在也使用Twitter来快速更新和共享链接。 请跟随我来:twitter.com/scottgu

这是我正在做的一系列关于即将来临的VS2010和.Net 4 release的第18篇博客。

数天前,我在博客上讲述了两个新的语言功能来使用C#4.0:可选参数和命名参数。

今天我要帖一些我最喜欢的新增加到VS2010里VB的一些功能:自动属性, 集合初始化器, 以及隐线连续支持。

自动属性

      在VB2010之前,用VB在类里实现属性需要明确地声明这个属性及实现支持字段变量来存储它的值。

比如,下面的代码就说明了如何实现用VB2008来实现Person这个类,它包含两个公共属性- “姓名”及“年龄”:

clip_image002

       虽然像上述代码明确声明属性提供了最大的灵活性,但是我总觉得写这种公式化的Get/Set代码很乏味,只是简单地存储/获取检索字段的值。 你可以使用VS的代码段来自动生成-但是它还是生成了很多冗余的代码。C# 2008提出了一个很酷的新功能叫做自动属性来帮助删除代码,在相当多常见情况下,属性只是简单地由一个字段来支持。现在VB2010也支持同样的功能。

       使用VB2010的自动属性, 我们现在就能用下面的代码来完成Person这个类了:

clip_image004

       当你声明一个自动化实现的类,VB编译器会自动创建一个私有的字段来存储属性值以及生成相关的Get/Set方法。 正如你上面所看到的-代码变得简洁得多,也更容易阅读。

       如果你想要初始化属性值,它也支持随意用默认值来初始化属性:

clip_image006

       你可以从MSDN学到更多关于VB2010的自动化属性支持。

集合初始化器

       VB2010现在也支持集合初始化器,可以很轻松地创建一个集合以及用一系列值来填充它。你可以通过声明一个集合变量来识别一个集合初始化器,然后输入From后面紧接着是大括号{},里面包含着要添加到集合里的初始值。

下面是一个代码实例,其中我使用了新建集合初始化功能来填充“Friends”,用了两个Person对象,然后把它绑定到GridView控件,显示在页面上。

clip_image008

        你可以从MSDN页面上能够学到更多关于VB2010的集合初始化器。

隐线连接支持

       习惯上,当VB的一个语句被分隔成好几行时,你不得不用下划线 "_” 来表示这个语句还没有结束。

       比如,在VB2008,下面的LINQ 查询语句需要在每一行的末尾加 “_”来表示这个查询语句还没有结束:

clip_image010

        VB2010的编译器和代码编辑器现在增加了对“隐线连续支持”的支持­­­—这也意味着它能更明智地自动检测行连接的情况。 这样的话,也就不再需要你明确表明这个语句要延续许多许多行。这也意味着VB2010根本不用“_”我们也能写出以上的代码。

clip_image012

       当用VB编辑XML时,隐线连接功能也能工作得很好(这是相当的酷)。

       你可以在MSDN页面上学到更多关于VB2010的隐线连接支持以及它所支持的多种情况。(请到“隐线连接”这一节找资料)。

概要

       上述三种vb语言功能,不过是随VB2010而来的一些新语言和代码编辑器功能。访问这个网站可以学到更多VB语言这次发布的其他一些功能。

       而且订阅VB团队博客可以学到更多, 保持他们能够定期地发布最新的帖子。

       希望这有所帮助,

当Debug时弄平类的层次

[原文作者]:Jared Parsons

[原文链接]:Flattening class hierarchies when debugging C#

       我在本周MVP会议上听到的一部分反馈,是在C#中调试到较深的类层次中时很痛苦。默认情况下,C#只显示一个给定类型的fields和Properties。要取得基类的成员,你必须展开它的Base节点。对于很深的层次必须要展开多次以获得期望的值。

以下面的类层次为例:

class Animal {

              public string name;

              public Animal(string name) {

              this.name = name;

     }

}

class Dog : Animal {

             public string color;

            public Dog(string name, string color)

            : base(name) {

            this.color = color;

            }

}

class Mutt : Dog {

           public List<string> breeds;

           public Mutt(string name, string color, params string[] breeds)

          : base(name, color) {

          this.breeds = new List<string>(breeds);

          }

}

        当你在调试器中处理Mutt的一个实例时,要知道它的name是什么需要点击以展开3次。

image

       层次越深,为取得期望的值所需的点击次数就越多,带来的痛苦就越多。

       几位MVP要求有一个选项可以在调试工作期中把这个层次弄平,这样他们就可以快速的获得数据。坏消息是:目前没有这么一个选项,而且Visual Studio 2010中也不会有。好消息是尽管如此你也可以通过利用现有的调试架构来获得这个功能。

       在Visual Studio 2005中负责调试器的团队就给BCL添加了一套attributes,让最终用户可以自定义他们的调试体验。我们可以使用其中的3个attributes来为一个指定的对象建立一个弄平了的层次。

  • DebuggerTypeProxy —— 当在调试器中展开一个值的时候,不显示当前值的成员,而代之以建立一个这个类型的实例并显示它的子成员。
  • DebuggerBrowsable —— 允许程序员去操作在一个类型中的单个 field 或 Property 的显示。
  • DebuggerDisplay —— 允许程序员去指定为一个类型的 Name、Value和Type列显示什么内容。

       弄平一个层次的基本策略,是在我们的类型代理中去做以下事情:

1. 建立一个新类型来握有包含每个成员的name、Value和Type的数组,让我们把它称作Member。

2. 给成员添加一个 DebuggerDisplay attribute,以使得它会模仿如何在调试器中显示一个正常的成员。

3. 使用反射来获得一个值上所有已定义的fields和Properties,并将它们封装到 Memeber 的实例上。

4. 通过一个强类型数组属性为一个值公布其所有的成员。

5. 给Property加上DebuggerBrowsable.RootHidden attribue。这么做的效果是:隐藏封装过的Property而代之以Proxy,原来的子成员们的位置上则放上弄平了的所有成员实例。

得到的结果是一个类型代理,它将显示一个对象行内展开后所有的成员。这里是完整的示例代码:

internal sealed class FlattenHierarchyProxy {

[DebuggerDisplay("{Value}", Name = "{Name,nq}", Type = "{Type.ToString(),nq}")]

internal struct Member {

                internal string Name;

                internal object Value;

               internal Type Type;

               internal Member(string name, object value, Type type) {

                       Name = name;

                       Value = value;

                       Type = type;

                }

}

[DebuggerBrowsable(DebuggerBrowsableState.Never)]

private readonly object _target;

[DebuggerBrowsable(DebuggerBrowsableState.Never)]

private Member[] _memberList;

[DebuggerBrowsable(DebuggerBrowsableState.RootHidden)]

internal Member[] Items {

get {

         if (_memberList == null) {

            _memberList = BuildMemberList().ToArray();

           }

return _memberList;

}

}

public FlattenHierarchyProxy(object target) {

_target = target;

}

private List<Member> BuildMemberList() {

var list = new List<Member>();

                if ( _target == null ) {

                  return list;

                }

var flags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance;

var type = _target.GetType();

foreach (var field in type.GetFields(flags)) {

var value = field.GetValue(_target);

list.Add(new Member(field.Name, value, field.FieldType));

}

foreach (var prop in type.GetProperties(flags)) {

object value = null;

      try {

          value = prop.GetValue(_target, null);

           }

      catch (Exception ex) {

       value = ex;

         }

      list.Add(new Member(prop.Nam
e, value, prop.PropertyType));

}

return list;

}

}

       最后一步,是给我们的类型层次的根类加上这个类型代理 Attribue。

[DebuggerTypeProxy(typeof(FlattenHierarchyProxy))]

class Animal {

       现在,当调试从Animal派生的实例的时候,程序员们将看到值的一个弄平了的层次。

image

在Visual Studio 2010 里,Dotfuscator变得更好(依然免费)

[原文作者]:Beth Massi     

[原文链接]:http://blogs.msdn.com/bethmassi/archive/2010/02/23/dotfuscator-gets-better-and-still-free-in-visual-studio-2010.aspx

        这周我学习了Visual Studio 2010里面的一个由 PreEmptive Solutions 提供的免费工具Dotfuscator软件服务,如果您正在使用Visual Studio2008的版本,那么你已经熟悉了其代码模糊技术(code obfuscation technology)。你将在2010里更深入了。新增加了一个全新基于代码注入的功能类,例如防止篡改和通知, 正如性能和使用的监督一样 。 如果你曾经想通过你的程序收集用户实际操作程序的信息来改进软件,它可以为你提供解决方案。

        我一直和一些人制作操作演示视频,展示如何让程序迅速启动和更快运行 。这些视频这品将会在 Developer Center Visual Basic开发中心发布,敬请期待。

        目前为止我所学到的,用Visual Studio 2010可以非常简单的建立你的程序并且编译这些功能。之后程序和一个叫做Runtime Intelligence Services Portal免费云服务通讯,它可以收集正在运行的程序的数据。但是,如果你不想使用PreEmptive的免费云服务,希望用自己的终端来收集信息,该怎么做?你十分幸运,因为今天PreEmptive发布了一个用于创建并且托管的终端开源的软件stater kit,在CodePlex上得到它:http://riendpointkit.codeplex.com/

        真的吗,如果它全部是免费的,这些家伙怎么赚钱?虽然Visual Studio2010的免费版中有一些伟大的功能,但是, 当然,专业版本有更多强大的功能,请看看这里两者的功能比较

        希望你会喜欢!

用 Visual Studio 2010 创建一个SharePoint 的Visual Web Part

[原文作者]:Beth Massi

[原文链接]:Creating a SharePoint Visual Web Part using Visual Studio 2010

     去年我们用Visual Studio 2008和Office & SharePoint 2007在Office 和SharePoint平台上开发了Northwind Office Business Application。后来我还写了相关的文章讲述如何用Visual Studio 2010把它升级到Office & SharePoint 2010。如果你错过了,下面是相关的内容:

· 在Visual Studio 2010下迁移Outlook客户端到.NET Framework 4

· 增强Outlook添加项与VS2010轻松交互的WPF数据控件

· 迁移一个2007 Workflow到Visual Studio & SharePoint 2010

     我也准备了一些关于迁移的示例应用程序:http://code.msdn.microsoft.com/OBANorthwind

    在那个示例程序中,如果你看VS2010的解决方案,你将会在那看到一些额外的工程,它们加了更多的功能到应用程序中。其中一个新项是Visual Web Part,从Northwind数据库看,它显示了低库存。Northwind的业务部门不但想看SharePoint上的订单状态(workflow),还想快速查阅一些低库存。 Visual Studio 2010为SharePoint 2010包含了许多新的工程和模板, Visual Web Part就是其中一项。如果你熟悉ASP.NET开发,那么你能很轻松地用Visual Studio 2010搭建一个SharePoint web part. 看看我们是如何来做的。

Visual Studio里创建一个Visual Web Part的工程

    首先,你需要用管理员身份打开Visual Studio。 用SharePoint编程的时候,debugger & tools需要管理员的权限。如果你忘记了,Visual Studio将会给与警告。

    其次,创建一个新的工程,选择SharePoint 2010->Visual Web Part。(确定你选了Visual Web Part,而不是Web Part)。将这个工程命名为LowInventoryWebPart。打开SharePoint个性化向导,选择你的SharePoint站点,在我的例子中,我已经创建了一个名为Northwind的组网站名。

    注意到只有”Deploy as a farm solution”一个可选项。也就是说,当你设计一个Visual web part时,它是对在 farm里的所有网站集合可用的,而不像一个sandboxed解决方案,只在网站集级别可用。这两者本质的区别在于它们运行在什么流程中,farm是IIS worker流程,这也给与了它们访问权限。 在MSDN库中,有更多关于Sandboxed和Farm解决方案区别的信息。

clip_image002

    点Finish,ASP.NET的设计器被打开,并显示网页用户控件。首先,我们需要加一个service reference到我们的data service中。如果你用data service通过WCF-REST取消,我们正暴露业务数据(此时为Northwind SQL数据库)。一旦我们部署,只要从SharePoint实例我们能够进入这个service,我们就能很好的到达。

     为了加一个service reference到data service, 选择Project->Add Service Reference。如果你的data service也在这个解决方案路径下,只要点Discover浏览data service暴露的类型。设置命名空间到NorthwindService并点OK。

设计Visual Web Part以及加载数据

    在此,我没有一些超级花式的设计技巧,所以我们将只是创建一个数据绑定的GridView,然后写一个LINQ查询获取并展示低库存物品。关键的是,这和我们写一些ASP.NET网页的代码是一样的,你甚至可以使用Toolbox里的Ajax控件。为了与 SharePoint列表交互,接下来的部分我们将利用SharePoint服务器模型的优势,从LOB数据库获取数据,因为它是标准的数据访问方式。

    从Toolbox,我们将拖拽一个GridView到窗体上,同时还将拖拽一个Label到窗体的下方以显示一些错误信息。我可以按照自己的风格来布局这些控件,在SharePoint的Web Part上,这些风格在显示方面都是一样的。

clip_image004

    右键点击设计器打开代码,在Page_Load事件处理程序中,我们将编写代码从我们的data service中加载低库存。

Imports System

Imports System.Web.UI

Imports System.Web.UI.WebControls

Imports System.Web.UI.WebControls.WebParts

Imports LowInventoryWebPart.NorthwindService

Partial Public Class LowInventoryWebPartUserControl

Inherits UserControl

Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load

‘Webpart Code to display Low Inventory:

Try

Dim ctx As New NorthwindEntities(New Uri("http://myserver/Northwind.svc/"))

Dim result = From p In ctx.Products _

Where p.UnitsInStock <= p.ReorderLevel _

Order By p.UnitsInStock

Me.GridView1.AutoGenerateColumns = True

Me.GridView1.DataSource = result.ToList()

Me.GridView1.DataBind()

Catch ex As Exception

Me.Label1.Text = ex.ToString

End Try

End Sub

End Class

调试Web Part

    现在让我们来测试它。如果LowInventoryWebPart项目默认不是你的解决方案的启动项目,那么设置它,并在LINQ查询中设置一个断点。按F5键,Visual Studio将自动为你回收IIS worker进程,打包,部署和启动功能,并附加调试器。下面的内容是显示在输出窗口的。

—— Deploy started: Project: LowInventoryWebPart, Configuration: Debug Any CPU ——
Active Deployment Configuration: Default
Run Pre-Deployment Command:
  Skipping deployment step because a pre-deployment command is not specified.
Recycle IIS Application Pool:
  Skipping application p
ool recycle because no matching package on the server was found.
Retract Solution:
  Skipping package retraction because no matching package on the server was found.
Add Solution:
  Adding solution ‘LowInventoryWebPart.wsp’…
  Deploying solution ‘LowInventoryWebPart.wsp’…
Activate Features:
  Activating feature ‘Feature1’ …
Run Post-Deployment Command:
  Skipping deployment step because a post-deployment command is not specified.
========== Build: 1 succeeded or up-to-date, 0 failed, 0 skipped ==========
========== Deploy: 1 succeeded, 0 failed, 0 skipped ==========

    幸运得是Visual Studio将处理所有的部署以及清理工作。当你关闭调试器,这个功能就无效了,相应的包也将被回收删除。请注意,你也可以指定部署前后的CMD命令。特征和包的设计是很灵活的。(更多信息请看频道9访谈:在Visual Studio 2010中SharePoint 特征和包的设计,以及参考MSDN库打包和部署SharePoint解决方案

    为了调试,我们首先必须将它添加到我们的网站页面上。当调试器启动时,它打开起初我们在SharePoint自定义向导中指定的页面地址。选择左上角的Site Actions->Edit Page。选择Insert标签并点击Web Part。选中并点击右下角的Add。

clip_image006

    此时调试到你设置的断点,按F11,查询时将返回低库存,因为你设计了这个页面,所以你能看见这些数据。有一点要记住,当设计web part的时候,Page_Load将被多次调用。

    接下来,打开web part右上角LowInventoryWebPart菜单的下拉框,选择Edit Web Part打开属性。设置标题为“低库存”,然后单击确定。在功能区选项卡上选择Save保存并关闭编辑的页面。现在我们已经有一个浏览低库存很好看的web part了。太棒了!

clip_image008

    关闭浏览器窗口,这将自动地关闭你的调试会话,回收IIS应用程序池,功能失效以及收回解决方案。这些步骤也会显示在输出窗口。

用服务器对象模型与SharePoint互动

    用一个简单的web part和data service很容易把我们LOB数据融入到SharePoint。如果用户看到一个很低的项,想把它加到任务列表呢?此时如果他们能做到这点,那就太妙了。在Visual Web Part我们是通过SharePoint服务器对象模型来和SharePoint进行交互的。此外也有SharePoint客户端对象模型,一个是Silverlight客户端,另一个是.NET Framework客户端。但是,当我们运行web part的时候,我们正在服务器上,所以我们有权限访问服务器对象模型。

    让我们添加一个TextBox和一个Button到我们的web part,web part允许用户直接在任务列表中输入任务。返回到Web Part的设计模式,在GridView下敲下Enter,并在下面输入”Create Task:”。从Toolbox标准的选项卡上,拖一个Textbox到窗体上,然后拖动一个Button,并设置其Text属性为“添加”。

    双击该按钮,我们可以在Button1的Click事件处理程序中添加一个任务。

Protected Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click

‘Webpart code to Add to task list

Try

Dim mySite As SPWeb = SPContext.Current.Web

Dim listItems As SPListItemCollection = mySite.Lists("Tasks").Items

Dim item As SPListItem = listItems.Add()

item("Title") = Me.TextBox1.Text

item("Assigned To") = mySite.AllUsers(Me.Context.User.Identity.Name)

item.Update()

Me.TextBox1.Text = ""

Me.Label1.Text = "Your task has been added to the task list"

Catch ex As Exception

Me.Label1.Text = ex.ToString

End Try

End Sub

    我们访问当前SharePoint站点是通过SPContext对象并得到Current.Web的。SharePoint开发时的SPContext就像ASP.NET开发时的HttpContext。因此,让我们测试一下吧。在Button1_Click处理函数那设置一个断点,并按F5部署以及调试。第二次的时候,你不需要再次添加web part到页面站点中,添加了新的控件和代码,它将会刷新。

    现在,通过输入一个描述,然后点击Add按钮来创建一个任务。设置断点,你能调试代码并探索一下服务器对象模型。

clip_image010

    当你完成后,导航到任务列表,将会发现你的任务已被添加。

clip_image012

    该解决方案位于http://code.msdn.microsoft.com/OBANorthwind,如果你是一个ASP.NET开发人员并刚开始使用SharePoint开发,那么还有很多东西需要学习,但幸运的是Visual Studio 2010可以帮你更容易地熟悉一个陌生的平台。

    下载Visual Studio 2010 测试版,通过http://msdn.com/vstudio演练。

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

 

[原文作者]: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