<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>EntLib.com 专业电子商务平台</title>
        <link>http://blog.entlib.com/EntLib/Default.aspx</link>
        <description>基于Microsoft .Net Framework / ASP.Net / C# / AJAX 平台构建的标准电子商务系统</description>
        <language>zh-CN</language>
        <copyright>EntLib.com</copyright>
        <managingEditor>entlib@hotmail.com</managingEditor>
        <generator>EntLib.com Blog Version 3.0.0.0</generator>
        <image>
            <title>EntLib.com 专业电子商务平台</title>
            <url>http://blog.entlib.com/images/RSS2Image.gif</url>
            <link>http://blog.entlib.com/EntLib/Default.aspx</link>
            <width>77</width>
            <height>60</height>
        </image>
        <item>
            <title>关于11. 26至12. 1-- EntLib.com服务器中断公告</title>
            <link>http://blog.entlib.com/EntLib/archive/2009/12/01/11.-2612.-1-entlib.com.aspx</link>
            <description>&lt;div align="center"&gt;&lt;span style="color: #ff0000"&gt;&lt;b&gt;关于11. 26&lt;/b&gt;&lt;b&gt;至12. 1-- EntLib.com&lt;/b&gt;&lt;b&gt;服务器中断公告&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;近日央视对移动机房相关涉黄问题进行报道，中国移动因信息安全检查工作需要，对机房进行整治，于11.26日早8点开始，中国移动全面暂停怒江路机房所有服务器的接入服务，并要检查每个IP地址对应的网站信息。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;11.26日移动已经明确封网，此次扫黄打非活动会持续到年底。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;可怜、无辜的EntLib.com 服务器也受到牵连，短期内也看不到解封的希望，欲哭无泪 …….&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;12. 1日 EntLib.com将服务器搬迁至电信机房，下午5：00网站已全面恢复！&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;因此给您带来了不便，在此EntLib.com向广大用户表示深深的歉意，并感觉大家对EntLib.com一如既往的支持！&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;相关链接：&lt;/div&gt;
&lt;div&gt;&lt;a href="http://home.cnblogs.com/group/topic/34453.html"&gt;EntLib.com&lt;span&gt;&lt;span&gt;官方网站无法访问疑受移动机房涉黄牵连&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;&lt;img src="http://blog.entlib.com/EntLib/aggbug/228.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>EntLib.com</dc:creator>
            <guid>http://blog.entlib.com/EntLib/archive/2009/12/01/11.-2612.-1-entlib.com.aspx</guid>
            <pubDate>Tue, 01 Dec 2009 11:41:57 GMT</pubDate>
            <wfw:comment>http://blog.entlib.com/EntLib/comments/228.aspx</wfw:comment>
            <comments>http://blog.entlib.com/EntLib/archive/2009/12/01/11.-2612.-1-entlib.com.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://blog.entlib.com/EntLib/comments/commentRss/228.aspx</wfw:commentRss>
        </item>
        <item>
            <title>比较Windows Workflow Foundation和BizTalk Server</title>
            <category>BizTalk &amp; ESB &amp; SOA</category>
            <link>http://blog.entlib.com/EntLib/archive/2009/09/26/windows-workflow-foundationbiztalk-server.aspx</link>
            <description>&lt;div align="center"&gt;&lt;b&gt;比较Windows Workflow Foundation&lt;/b&gt;&lt;b&gt;和BizTalk Server&lt;/b&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;b&gt;简介&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;WF和BizTalk Server 有很多相似性，下面分析、比较WF和BizTalk，和大家一起分享。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;b&gt;Windows Workflow Foundation&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;WF 是一种编程模型、一组工具控件、和运行时，在Windows平台上实现工作流。WF运行时是.NET Framework的一部分，首先出现在.NET Framework 3.0，随后在.NET Framework 3.5 中进行改进。关于WF的范例学习程序，&lt;a href="http://forum.entlib.com/Default.aspx?g=topics&amp;amp;f=14"&gt;&lt;span&gt;&lt;span&gt;请参考如下链接&lt;/span&gt;&lt;/span&gt;。&lt;/a&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;b&gt;Microsoft BizTalk Server&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;Microsoft BizTalk Server提供了高效的方式，通过可管理的业务流程来实现系统和业务集成，让不同的系统和业务之间进行灵活地、自动地交互。关于BizTalk 的范例学习程序，&lt;a href="http://forum.entlib.com/Default.aspx?g=topics&amp;amp;f=13"&gt;&lt;span&gt;&lt;span&gt;请参考如下链接&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;。BizTalk Server 提供了对业务流程管理（Business Process Management, BPM）和自动化的开发和运行环境。&lt;/div&gt;
&lt;div align="center"&gt; &lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div style="text-align: center"&gt;&lt;img alt="" width="486" height="282" src="/userfiles/EntLib/image/BiztalkServer/biztalk_2009_1.jpg" /&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;b&gt;WF&lt;/b&gt;&lt;b&gt;和BizTalk Server&lt;/b&gt;&lt;b&gt;的本质区别&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;WF和BizTalk Server并不是相互竞争的技术，而是互补的技术，用来满足不同的需要。&lt;br /&gt;
 &lt;/div&gt;
&lt;div style="text-align: center"&gt;&lt;img alt="" width="667" height="324" src="/userfiles/EntLib/image/BiztalkServer/biztalk_WF_comparison_1.gif" /&gt;&lt;br /&gt;
 &lt;/div&gt;
&lt;div style="text-align: left"&gt;
&lt;div&gt;&lt;b&gt;WF &lt;/b&gt;&lt;b&gt;和BizTalk Server&lt;/b&gt;&lt;b&gt;的功能比较&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;下表显示了WF和BizTalk Server的功能比较。&lt;/div&gt;
&lt;div style="text-align: center"&gt;&lt;img alt="" width="667" height="951" src="/userfiles/EntLib/image/BiztalkServer/biztalk_WF_comparison_2.gif" /&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;本文由&lt;a href="http://forum.entlib.com/"&gt;http://forum.EntLib.com&lt;/a&gt; 开源ASP.NET论坛小组编译，原文链接如下:&lt;/div&gt;
&lt;div&gt;&lt;a href="http://www.codeproject.com/KB/biztalk/BizTalk-WF-Compare.aspx"&gt;Comparison between Windows Workflow Foundation and Biz Talk Serve&lt;/a&gt;r&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;/div&gt;&lt;img src="http://blog.entlib.com/EntLib/aggbug/216.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>EntLib.com</dc:creator>
            <guid>http://blog.entlib.com/EntLib/archive/2009/09/26/windows-workflow-foundationbiztalk-server.aspx</guid>
            <pubDate>Sat, 26 Sep 2009 12:47:20 GMT</pubDate>
            <wfw:comment>http://blog.entlib.com/EntLib/comments/216.aspx</wfw:comment>
            <comments>http://blog.entlib.com/EntLib/archive/2009/09/26/windows-workflow-foundationbiztalk-server.aspx#feedback</comments>
            <wfw:commentRss>http://blog.entlib.com/EntLib/comments/commentRss/216.aspx</wfw:commentRss>
        </item>
        <item>
            <title>ASP.NET MVC 最佳实践向导（Best Practices ）</title>
            <category>MVC Framework</category>
            <link>http://blog.entlib.com/EntLib/archive/2009/09/20/asp.net-mvc-best-practices.aspx</link>
            <description>&lt;div align="center"&gt;&lt;b&gt;ASP.NET MVC &lt;/b&gt;&lt;b&gt;最佳实践向导（Best Practices &lt;/b&gt;&lt;b&gt;）&lt;/b&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;ASP.NET MVC 是微软官方提供的一个新的开发框架，下面有一些博客帖子介绍了使用ASP.NET MVC 框架开发Web Applications的推荐最佳实践。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;span style="color: #343434; font-size: 9pt"&gt;&lt;a target="_blank" href="http://weblogs.asp.net/rashid/archive/2009/04/01/asp-net-mvc-best-practices-part-1.aspx"&gt;Part I&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color: #343434; font-size: 9pt"&gt;&lt;a target="_blank" href="http://weblogs.asp.net/rashid/archive/2009/04/03/asp-net-mvc-best-practices-part-2.aspx"&gt;Part II&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;b&gt;ASP.NET MVC &lt;/b&gt;&lt;b&gt;资源&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;&lt;a href="http://forum.entlib.com/Default.aspx?g=posts&amp;amp;t=476"&gt;&lt;span&gt;&lt;span&gt;中文&lt;/span&gt;Professional ASP.NET MVC 1.0 – Nerd Dinner &lt;span&gt;范例程序&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color: #343434; font-size: 9pt"&gt;&lt;a href="http://www.tampadev.org/News/Details/ASPNETMVCSampleApplicationsOpenSourceExamplesTutorials"&gt;ASP.NET MVC Sample Applications - Open-Source Examples and Tutorials&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color: #343434; font-size: 9pt"&gt;&lt;a href="http://www.tampadev.org/News/Details/ASPNETMVCScreencastsVideosWebcastsLearnASPNETMVCFramework"&gt;&lt;font color="#034af3"&gt;ASP.NET MVC Screencasts Videos and Webcasts - Learn ASP.NET MVC Framework&lt;/font&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color: #343434; font-size: 9pt"&gt;&lt;a href="http://www.tampadev.org/News/Details/ASPNETMVCVideosScreencastsMIX09SessionsFreeTraining"&gt;&lt;font color="#034af3"&gt;ASP.NET MVC Videos and Screencasts from MIX 09 Sessions - Free Training&lt;/font&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color: #343434; font-size: 9pt"&gt;&lt;a href="http://www.tampadev.org/News/Details/DownloadASPNETMVCSampleMovieDatabaseApplicationDevConnections"&gt;&lt;font color="#034af3"&gt;Download ASP.NET MVC Sample Movie Database Application from DevConnections&lt;/font&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color: #343434; font-size: 9pt"&gt;&lt;a href="http://www.tampadev.org/News/Details/ASPNETMVCTrainingKitHandOnLabsSamplesTutorialsPresentations"&gt;ASP.NET MVC Training Kit - Hand-On Labs Samples Tutorials Presentations&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt; &lt;/div&gt;&lt;img src="http://blog.entlib.com/EntLib/aggbug/214.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>EntLib.com</dc:creator>
            <guid>http://blog.entlib.com/EntLib/archive/2009/09/20/asp.net-mvc-best-practices.aspx</guid>
            <pubDate>Sun, 20 Sep 2009 11:03:54 GMT</pubDate>
            <wfw:comment>http://blog.entlib.com/EntLib/comments/214.aspx</wfw:comment>
            <comments>http://blog.entlib.com/EntLib/archive/2009/09/20/asp.net-mvc-best-practices.aspx#feedback</comments>
            <wfw:commentRss>http://blog.entlib.com/EntLib/comments/commentRss/214.aspx</wfw:commentRss>
        </item>
        <item>
            <title>业务逻辑层（ASP.NET 3.5 Enterprise Application Development）读书笔记</title>
            <category>ASP.NET 3.5</category>
            <link>http://blog.entlib.com/EntLib/archive/2009/07/04/asp.net-3.5-enterprise-application-development-again.aspx</link>
            <description>&lt;div align="center"&gt;&lt;b&gt;业务逻辑层（ASP.NET 3.5 Enterprise Application Development&lt;/b&gt;&lt;b&gt;）读书笔记&lt;/b&gt;&lt;/div&gt;
&lt;div align="center"&gt;&lt;b&gt;-- Problem – Design – Solution&lt;/b&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;本文是针对Wrox出版的《ASP.NET 3.5 Enterprise Application Development With Visual Studio 2008 Problem Design Solution》该书第三章Business Logic Layer（业务逻辑层）读书笔记。&lt;a href="http://forum.entlib.com/"&gt;http://forum.EntLib.com&lt;/a&gt; 开源论坛小组提供，欢迎交流，分享。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;上一篇文章：&lt;a href="http://blog.entlib.com/EntLib/archive/2009/06/11/asp.net-3.5-enterprise-application-development.aspx"&gt;数据访问层（ASP.NET 3.5 Enterprise Application Development）读书笔记&lt;/a&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;原文介绍在三层架构应用中业务逻辑层的设计。在业务逻辑层中，定义了四个基类，如下图所示：&lt;br /&gt;
 &lt;/div&gt;
&lt;div style="text-align: center"&gt;&lt;img alt="" width="538" height="477" src="/userfiles/EntLib/image/ASP.NET/EntAppDev_Chapter3_1.gif" /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;img alt="" width="535" height="225" src="/userfiles/EntLib/image/ASP.NET/EntAppDev_Chapter3_2.gif" /&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;b&gt;ENTBaseBO &lt;/b&gt;&lt;b&gt;是业务对象的基类，不允许用户改变。&lt;/b&gt;通常，这一类型的业务对象显示在用户界面的下拉列表框。该类中包含了一些所有业务对象共同的属性，如ID、InsertDate、InsertENTUserAccountId…等等。另外，增加了一个有用的只读属性 DisplayText，以及一个对应的抽象方法GetDisplayText()，必须在继承子类中实现该方法。&lt;/div&gt;
&lt;div&gt;public string DisplayText&lt;/div&gt;
&lt;div&gt;{&lt;/div&gt;
&lt;div style="text-indent: 21pt"&gt;get { return GetDisplayText(); }&lt;/div&gt;
&lt;div&gt;}&lt;/div&gt;
&lt;div&gt;protected abstract string GetDisplayText();&lt;/div&gt;
&lt;div&gt;这一属性可用来将对象显示在UI层或者任何数据绑定控件。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;该类唯一的公有方法Load，用来从数据库中检索数据 – 没有增加、更新、或删除操作。&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 9pt"&gt;        #region&lt;/span&gt;&lt;span style="font-size: 9pt"&gt; Abstract Methods&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;        &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;abstract&lt;/span&gt; &lt;span style="color: blue"&gt;bool&lt;/span&gt; Load(&lt;span style="color: blue"&gt;int&lt;/span&gt; id);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;        &lt;span style="color: blue"&gt;protected&lt;/span&gt; &lt;span style="color: blue"&gt;abstract&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; MapEntityToCustomProperties(&lt;span style="color: #2b91af"&gt;IENTBaseEntity&lt;/span&gt; entity);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;        &lt;span style="color: blue"&gt;protected&lt;/span&gt; &lt;span style="color: blue"&gt;abstract&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; GetDisplayText();&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 9pt"&gt;        #endregion&lt;/span&gt;&lt;span style="font-size: 9pt"&gt; Abstratct Methods&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt; &lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 9pt"&gt;        #region&lt;/span&gt;&lt;span style="font-size: 9pt"&gt; Public Methods&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;        &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; MapEntityToProperties(&lt;span style="color: #2b91af"&gt;IENTBaseEntity&lt;/span&gt; entity)&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;        {            &lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: blue"&gt;if&lt;/span&gt; (entity != &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                InsertDate = entity.InsertDate;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                InsertENTUserAccountId = entity.InsertENTUserAccountId;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                UpdateDate = entity.UpdateDate;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                UpdateENTUserAccountId = entity.UpdateENTUserAccountId;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                Version = entity.Version;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;b&gt;&lt;span style="font-size: 9pt"&gt;                &lt;span style="color: blue"&gt;this&lt;/span&gt;.MapEntityToCustomProperties(entity);&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            }&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;        }&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt; &lt;/div&gt;
&lt;div&gt;&lt;span style="color: blue; font-size: 9pt"&gt;        #endregion&lt;/span&gt;&lt;span style="font-size: 9pt"&gt; Public Methods&lt;/span&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;任何继承ENTBaseBO 的业务类必须事先Load和MapentityToCustomProperties 方法。在实现Load方法时，从DAL检索一个单一的实体，并调用MapEntityToProperties 方法。MapEntityToProperties 方法负责将5个公共的字典赋值给当前的对象实例，并接着调用MapEntityToCustomProperties 方法。MapEntityToCustomProperties 方法则负责将其他的实体对象的属性赋值给业务对象的属性，这是因为这些属性不是基类中的共用的属性。 --- &lt;a href="http://forum.entlib.com/"&gt;http://forum.EntLib.com&lt;/a&gt; 开源小组注：作者使用的业务对象（Business Object）是自己编写的，不是LINQ to SQL 设计器自动创建的实体对象（Entity Object）。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;下面是业务对象中，Load和MapEntityToCustomProperties 方法的一段范例代码：&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;        &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;override&lt;/span&gt; &lt;span style="color: blue"&gt;bool&lt;/span&gt; Load(&lt;span style="color: blue"&gt;int&lt;/span&gt; id)&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;        {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: #2b91af"&gt;ENTUserAccount&lt;/span&gt; userAccount = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;ENTUserAccountData&lt;/span&gt;().Select(id);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: blue"&gt;if&lt;/span&gt; (userAccount != &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;b&gt;&lt;span style="font-size: 9pt"&gt;                MapEntityToProperties(userAccount);&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                &lt;span style="color: blue"&gt;return&lt;/span&gt; &lt;span style="color: blue"&gt;true&lt;/span&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            }&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: blue"&gt;else&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                &lt;span style="color: blue"&gt;return&lt;/span&gt; &lt;span style="color: blue"&gt;false&lt;/span&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            }        &lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;        }&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt; &lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;        &lt;span style="color: blue"&gt;protected&lt;/span&gt; &lt;span style="color: blue"&gt;override&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; MapEntityToCustomProperties(&lt;span style="color: #2b91af"&gt;IENTBaseEntity&lt;/span&gt; entity)&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;        {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: #2b91af"&gt;ENTUserAccount&lt;/span&gt; userAccount = (&lt;span style="color: #2b91af"&gt;ENTUserAccount&lt;/span&gt;)entity;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt; &lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            ID = userAccount.ENTUserAccountId;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            WindowsAccountName = userAccount.WindowsAccountName;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            FirstName = userAccount.FirstName;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            LastName = userAccount.LastName;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            Email = userAccount.Email;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            IsActive = userAccount.IsActive;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="font-size: 9pt"&gt;        }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;ENTBaseBOList 集合类表示ENTBaseBO 基类集合，包含唯一的一个抽象方法Load，该方法负责从数据库中检索所有的记录。如果你需要过滤部分记录，你可以在继承类中重载Load方法。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;b&gt;ENTBaseEO &lt;/b&gt;&lt;b&gt;是另一个抽象类，EO&lt;/b&gt;&lt;b&gt;表示“可编辑对象（Edit Object&lt;/b&gt;&lt;b&gt;）”，表示一个单一实例的特定业务对象。&lt;/b&gt;ENTBaseEO 和 ENTBaseBO的区别是：ENTBaseEO 允许对象使用者增加、更新和删除数据库记录。ENTBaseEO继承自ENTBaseBO。&lt;/div&gt;
&lt;div&gt;ENTBaseEO 类中添加了一个枚举类型DBActionEnum：&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;        &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;enum&lt;/span&gt; &lt;span style="color: #2b91af"&gt;DBActionEnum&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;        {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            Save,&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            Delete&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="font-size: 9pt"&gt;        }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;同时，也包含DBActionEnum的公有属性DBAction：&lt;/div&gt;
&lt;div&gt;&lt;span style="color: blue; font-size: 9pt"&gt;public&lt;/span&gt;&lt;span style="font-size: 9pt"&gt; &lt;span style="color: #2b91af"&gt;DBActionEnum&lt;/span&gt; DBAction { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;关于Save方法，其中一个在基类中实现，并调用另一个抽象的Save方法，该方法必须在继承子类中实现，因为至少需要传入具体的参数。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;在保存记录到数据库之前，必须调用Validate方法进行业务数据和规则的验证。其中，会涉及到ENTValidationError 类和ENTValidationErros 集合类。验证业务数据和规则一定与具体的业务对象相关，因此Validate抽象方法一定要在业务子类中来实现。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div style="text-align: center"&gt;&lt;img alt="" width="427" height="200" src="/userfiles/EntLib/image/ASP.NET/EntAppDev_Chapter3_3.gif" /&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;另一个Init抽象方法，主要是实现一些数据的初始化操作。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;下面是Delete操作相关的一些方法。首先是下面的两个抽象方法：&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;        &lt;span style="color: blue"&gt;protected&lt;/span&gt; &lt;span style="color: blue"&gt;abstract&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; DeleteForReal(&lt;span style="color: #2b91af"&gt;HRPaidTimeOffDataContext&lt;/span&gt; db);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="font-size: 9pt"&gt;        &lt;span style="color: blue"&gt;protected&lt;/span&gt; &lt;span style="color: blue"&gt;abstract&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; ValidateDelete(&lt;span style="color: #2b91af"&gt;HRPaidTimeOffDataContext&lt;/span&gt; db, &lt;span style="color: blue"&gt;ref&lt;/span&gt; &lt;span style="color: #2b91af"&gt;ENTValidationErrors&lt;/span&gt; validationErrors);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;DeleteForReal方法会调用DAL的Delete方法。ValidateDelete 方法类似于前面的Validate方法，主要是在执行删除操作之前，进行必要的数据检查。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;Delete方法在基类中实现，并调用DeleteForReal方法，与Save方法比较类似，有2个重载的Delete方法。第一个Delete方法启动事务，并调用第二个Delete方法，传入HRPaidTimeOffDataContext 对象。第二个Delete方法在调用DeleteForReal方法之前，先调用ValidateDelete 方法，进行数据验证。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;IsNewRecord 方法比较简单，只是用来返回对象是否为新纪录，用在Save方法中判断对象是插入或者更新操作。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;最后一个是UpdateFailed方法，在更新记录发生异常时，该方法用来添加一条信息到validationErrors 集合对象中，并最终显示在UI界面上。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;b&gt;最后一个基类是ENTBaseEOList&lt;/b&gt;&lt;b&gt;，表示可编辑的业务对象集合，该类继承自ENTBaseBOList&lt;/b&gt;&lt;b&gt;类。&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;[Serializable()]&lt;/div&gt;
&lt;div&gt;public abstract class ENTBaseEOList&amp;lt;T&amp;gt; : ENTBaseBOList&amp;lt;T&amp;gt;&lt;/div&gt;
&lt;div style="text-indent: 21pt"&gt;where T : ENTBaseEO, new()&lt;/div&gt;
&lt;div&gt;{ … }&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;ENTBaseEOList 类主要有2个方法：Save 和 GetAll。其中，Save 方法将增加或删除集合对象到数据库中（&lt;a href="http://forum.entlib.com/"&gt;http://forum.entlib.com&lt;/a&gt; 开源小组注：根据ENTBaseEO.DBActionEnum 属性值，来执行Save或Delete操作），Save方法有2个重载。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;GetAll方法比较简单，调用基类ENTBaseBOList 的Load方法，检索所有的业务对象实例，返回集合对象自身。&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;        &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&amp;lt;T&amp;gt; GetAll()&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;        {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: blue"&gt;this&lt;/span&gt;.Load();&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: blue"&gt;return&lt;/span&gt; &lt;span style="color: blue"&gt;this&lt;/span&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="font-size: 9pt"&gt;        }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;到现在为止，我们已经创建了所有的基类。下一步，创建一个可编辑的业务对象ENTUserAccountEO。&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;    [&lt;span style="color: #2b91af"&gt;Serializable&lt;/span&gt;()]&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="font-size: 9pt"&gt;    &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;ENTUserAccountEO&lt;/span&gt; : &lt;span style="color: #2b91af"&gt;ENTBaseEO&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;关于该类的具体实现，可以查看原文。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;b&gt;&lt;span style="font-size: 14pt"&gt;总结&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="font-size: 14pt"&gt; Summary&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;本文集中介绍了业务逻辑层和创建了4个基类，本书的后面章节都将使用都这些基类。其中，在BLL层，将业务对象分为两类：静态业务对象和可编辑业务对象。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;b&gt;BLL&lt;/b&gt;&lt;b&gt;和DAL&lt;/b&gt;&lt;b&gt;的交互：&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;1. 从DAL检索数据，以单一实体对象（Entity Object）、实体对象计划、或数值（Scalar values）传递给BLL。&lt;/div&gt;
&lt;div&gt;2. 以数值（Scalar values）的形式传递数据到DAL层。（&lt;a href="http://forum.entlib.com/"&gt;http://forum.entlib.com&lt;/a&gt; 开源论坛小组注：是以数值的形式传递，还是以实体对象的形式传递，各有优缺点。不过，在具体项目中，我们一般多采用传递实体对象，这样，方法的signature 不需要发生变化。）&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;b&gt;BLL&lt;/b&gt;&lt;b&gt;和UI&lt;/b&gt;&lt;b&gt;层的交互：&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;1. UI层创建业务对象实例，并调用Load 方法检索数据。&lt;/div&gt;
&lt;div&gt;2. UI层创建业务对象实例，并给对象属性赋值，然后调用Save方法，增加或更新记录；或者调用Delete方法删除记录。&lt;/div&gt;
&lt;div&gt;3. 冲突的验证规则会以ENTValidationErrors集合类的形式传递到UI层。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;b&gt;创建继承自ENTBaseBO&lt;/b&gt;&lt;b&gt;基类的关键点：&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;1. 定义类为 Serializable。&lt;/div&gt;
&lt;div&gt;2. 创建业务对象（business object）的自有属性。&lt;/div&gt;
&lt;div&gt;3. 实现GetDisplayText 方法，返回对象在下拉列表或ListBox 中显示的文本。&lt;/div&gt;
&lt;div&gt;4. 实现Load 方法，从DAL返回单一的实体对象（Entity Object）。&lt;/div&gt;
&lt;div&gt;5. 实现MapEntityToCustomProperties 方法，将实体对象的属性赋值给业务对象的对应属性。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;b&gt;创建继承自ENTBaseBoList&lt;/b&gt;&lt;b&gt;基类的关键点：&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;1. 定义类为 Serializable。&lt;/div&gt;
&lt;div&gt;2. 实现Load方法，从DAL返回所有的实体对象。&lt;/div&gt;
&lt;div&gt;3. 重载Load方法，过滤从DAL返回的实体对象。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;b&gt;创建继承自 ENTBaseEO &lt;/b&gt;&lt;b&gt;基类的关键点：&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;1. 按照上述实现ENTBaseBo基类的相同步骤。&lt;/div&gt;
&lt;div&gt;2. 实现Save方法，并调用Validate方法进行数据验证，同时确定是新增或更新记录，然后以数值（Scalar value）的形式传递给DAL中相应的方法。&lt;/div&gt;
&lt;div&gt;3. 实现Validate 方法，对业务对象的数据进行验证。任何冲突的数据将添加到validationErrors集合中。&lt;/div&gt;
&lt;div&gt;4. 实现DeleteForReal方法，该方法调用DAL层的Delete方法，进行数据删除操作。&lt;/div&gt;
&lt;div&gt;5. 实现ValidateDelete 方法，在删除记录之前，进行强制数据规则验证，一般为数据完整性验证。&lt;/div&gt;
&lt;div&gt;6. 实现Init方法，该方法在用户创建一条新纪录是，设置对象的默认属性。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;b&gt;创建继承自ENTBaseEOList &lt;/b&gt;&lt;b&gt;基类的关键点：&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;1. 完全按照实现ENTBaseBOList基类的步骤即可。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;下一节将介绍用户界面层（User Interface Layer）的设计，欢迎交流。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;&lt;img src="http://blog.entlib.com/EntLib/aggbug/195.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>EntLib.com</dc:creator>
            <guid>http://blog.entlib.com/EntLib/archive/2009/07/04/asp.net-3.5-enterprise-application-development-again.aspx</guid>
            <pubDate>Sat, 04 Jul 2009 00:50:30 GMT</pubDate>
            <wfw:comment>http://blog.entlib.com/EntLib/comments/195.aspx</wfw:comment>
            <comments>http://blog.entlib.com/EntLib/archive/2009/07/04/asp.net-3.5-enterprise-application-development-again.aspx#feedback</comments>
            <wfw:commentRss>http://blog.entlib.com/EntLib/comments/commentRss/195.aspx</wfw:commentRss>
        </item>
        <item>
            <title>数据访问层（ASP.NET 3.5 Enterprise Application Development）读书笔记</title>
            <category>ASP.NET 3.5</category>
            <link>http://blog.entlib.com/EntLib/archive/2009/06/11/asp.net-3.5-enterprise-application-development.aspx</link>
            <description>&lt;div align="center"&gt;&lt;b&gt;数据访问层（ASP.NET 3.5 Enterprise Application Development&lt;/b&gt;&lt;b&gt;）读书笔记&lt;/b&gt;&lt;/div&gt;
&lt;div align="center"&gt;&lt;b&gt;-- Problem – Design – Solution&lt;/b&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;本文是针对Wrox出版的《ASP.NET 3.5 Enterprise Application Development With Visual Studio 2008 Problem Design Solution》该书第二章Data Access Layer（数据访问层）读书笔记。&lt;a href="http://forum.entlib.com/"&gt;http://forum.EntLib.com&lt;/a&gt; 开源论坛小组提供，欢迎交流，分享。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;原文介绍在三层架构应用中使用 LINQ to SQL技术。该设计模式使用DataContext 和数据库交互，ORM Designer设计器生成的实体对象（Entity Object）则负责与BLL（业务逻辑层）交互。&lt;/div&gt;
&lt;div&gt;该架构的设计图如下所示：&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div style="text-align: center"&gt;&lt;img alt="" width="626" height="550" src="/userfiles/EntLib/image/ASP.NET/EntAppDev_Chapter2_1.gif" /&gt; &lt;br /&gt;
 &lt;/div&gt;
&lt;div&gt;在原文中通过将存储过程拖拉到ORM 设计器中，并使用存储过程来访问数据，如Insert、Update、Delete、Select等等方法。如下图所示：&lt;br /&gt;
 &lt;/div&gt;
&lt;div style="text-align: center"&gt;&lt;img alt="" width="672" height="363" src="/userfiles/EntLib/image/ASP.NET/EntAppDev_Chapter2_2.gif" /&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;将Method Panel中的方法与ORM 设计器中实体对象进行的关联的步骤如下。&lt;/div&gt;
&lt;div&gt;首先，选择ORM 设计器中的实体对象，如上图中的ENTUserAccount。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;然后，查看属性列表，比如点击Insert 属性后的弹出按钮，弹出如下对话框。&lt;br /&gt;
 &lt;/div&gt;
&lt;div style="text-align: center"&gt;&lt;img alt="" width="666" height="645" src="/userfiles/EntLib/image/ASP.NET/EntAppDev_Chapter2_3.gif" /&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;经过上述设置后，DataContext 将调用存储过程来插入记录，而不是想之前的创建动态的SQL脚本。在DBML自动创建的cs文件中，可以看到如下2个方法：&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;         &lt;span style="color: blue"&gt;private&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; InsertENTUserAccount(&lt;span style="color: #2b91af"&gt;ENTUserAccount&lt;/span&gt; obj)&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;         {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;              System.&lt;span style="color: #2b91af"&gt;Nullable&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;int&lt;/span&gt;&amp;gt; p1 = obj.ENTUserAccountId;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;              &lt;span style="color: blue"&gt;this&lt;/span&gt;.ENTUserAccountInsert(&lt;span style="color: blue"&gt;ref&lt;/span&gt; p1, obj.WindowsAccountName, obj.FirstName, obj.LastName, obj.Email, ((System.&lt;span style="color: #2b91af"&gt;Nullable&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;bool&lt;/span&gt;&amp;gt;)(obj.IsActive)), ((System.&lt;span style="color: #2b91af"&gt;Nullable&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;int&lt;/span&gt;&amp;gt;)(obj.InsertENTUserAccountId)));&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;              obj.ENTUserAccountId = p1.GetValueOrDefault();&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="font-size: 9pt"&gt;         }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;         [&lt;span style="color: #2b91af"&gt;Function&lt;/span&gt;(Name=&lt;span style="color: #a31515"&gt;"dbo.ENTUserAccountInsert"&lt;/span&gt;)]&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;         &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;int&lt;/span&gt; ENTUserAccountInsert([&lt;span style="color: #2b91af"&gt;Parameter&lt;/span&gt;(Name=&lt;span style="color: #a31515"&gt;"ENTUserAccountId"&lt;/span&gt;, DbType=&lt;span style="color: #a31515"&gt;"Int"&lt;/span&gt;)] &lt;span style="color: blue"&gt;ref&lt;/span&gt; System.&lt;span style="color: #2b91af"&gt;Nullable&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;int&lt;/span&gt;&amp;gt; eNTUserAccountId, [&lt;span style="color: #2b91af"&gt;Parameter&lt;/span&gt;(Name=&lt;span style="color: #a31515"&gt;"WindowsAccountName"&lt;/span&gt;, DbType=&lt;span style="color: #a31515"&gt;"VarChar(50)"&lt;/span&gt;)] &lt;span style="color: blue"&gt;string&lt;/span&gt; windowsAccountName, [&lt;span style="color: #2b91af"&gt;Parameter&lt;/span&gt;(Name=&lt;span style="color: #a31515"&gt;"FirstName"&lt;/span&gt;, DbType=&lt;span style="color: #a31515"&gt;"VarChar(50)"&lt;/span&gt;)] &lt;span style="color: blue"&gt;string&lt;/span&gt; firstName, [&lt;span style="color: #2b91af"&gt;Parameter&lt;/span&gt;(Name=&lt;span style="color: #a31515"&gt;"LastName"&lt;/span&gt;, DbType=&lt;span style="color: #a31515"&gt;"VarChar(50)"&lt;/span&gt;)] &lt;span style="color: blue"&gt;string&lt;/span&gt; lastName, [&lt;span style="color: #2b91af"&gt;Parameter&lt;/span&gt;(Name=&lt;span style="color: #a31515"&gt;"Email"&lt;/span&gt;, DbType=&lt;span style="color: #a31515"&gt;"VarChar(100)"&lt;/span&gt;)] &lt;span style="color: blue"&gt;string&lt;/span&gt; email, [&lt;span style="color: #2b91af"&gt;Parameter&lt;/span&gt;(Name=&lt;span style="color: #a31515"&gt;"IsActive"&lt;/span&gt;, DbType=&lt;span style="color: #a31515"&gt;"Bit"&lt;/span&gt;)] System.&lt;span style="color: #2b91af"&gt;Nullable&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;bool&lt;/span&gt;&amp;gt; isActive, [&lt;span style="color: #2b91af"&gt;Parameter&lt;/span&gt;(Name=&lt;span style="color: #a31515"&gt;"InsertENTUserAccountId"&lt;/span&gt;, DbType=&lt;span style="color: #a31515"&gt;"Int"&lt;/span&gt;)] System.&lt;span style="color: #2b91af"&gt;Nullable&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;int&lt;/span&gt;&amp;gt; insertENTUserAccountId)&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;         {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;              &lt;span style="color: #2b91af"&gt;IExecuteResult&lt;/span&gt; result = &lt;span style="color: blue"&gt;this&lt;/span&gt;.ExecuteMethodCall(&lt;span style="color: blue"&gt;this&lt;/span&gt;, ((&lt;span style="color: #2b91af"&gt;MethodInfo&lt;/span&gt;)(&lt;span style="color: #2b91af"&gt;MethodInfo&lt;/span&gt;.GetCurrentMethod())), eNTUserAccountId, windowsAccountName, firstName, lastName, email, isActive, insertENTUserAccountId);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;              eNTUserAccountId = ((System.&lt;span style="color: #2b91af"&gt;Nullable&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;int&lt;/span&gt;&amp;gt;)(result.GetParameterValue(0)));&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;              &lt;span style="color: blue"&gt;return&lt;/span&gt; ((&lt;span style="color: blue"&gt;int&lt;/span&gt;)(result.ReturnValue));&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="font-size: 9pt"&gt;         }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;其中第一个方法接收一个ENTUserAccount 对象的参数，并调用第二个方法，将对象的属性作为参数传入。第二个方法接收存储过程的每一个参数，接着调用DataContext对象的ExecuteMethodCall方法，该方法知道如何调用存储过程，并返回结果。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;另外的Delete、Update属性操作相似。操作完成后，ENTUserAccount 实体对象的属性列表如下所示：&lt;br /&gt;
 &lt;/div&gt;
&lt;div style="text-align: center"&gt;&lt;img alt="" width="691" height="277" src="/userfiles/EntLib/image/ASP.NET/EntAppDev_Chapter2_4.gif" /&gt;&lt;br /&gt;
 &lt;/div&gt;
&lt;div&gt;客户端调用的示例代码如下：&lt;/div&gt;
&lt;div&gt;//Create an instance of the data context&lt;/div&gt;
&lt;div&gt;HRPaidTimeOffDataContext db = new HRPaidTimeOffDataContext();&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;//Create a new ENTUserAccount object and set the properties&lt;/div&gt;
&lt;div&gt;ENTUserAccount userAccount = new ENTUserAccount&lt;/div&gt;
&lt;div&gt;{&lt;/div&gt;
&lt;div style="margin: 0cm 0cm 0pt 10.5pt"&gt;WindowsAccountName = @”VARALLO1\VaralloMadison”,&lt;/div&gt;
&lt;div style="margin: 0cm 0cm 0pt 10.5pt"&gt;FirstName = “Madison”,&lt;/div&gt;
&lt;div style="margin: 0cm 0cm 0pt 10.5pt"&gt;LastName = “Varallo”,&lt;/div&gt;
&lt;div style="margin: 0cm 0cm 0pt 10.5pt"&gt;Email = “madison.varallo@v2.com”,&lt;/div&gt;
&lt;div style="margin: 0cm 0cm 0pt 10.5pt"&gt;IsActive = true,&lt;/div&gt;
&lt;div style="margin: 0cm 0cm 0pt 10.5pt"&gt;InsertDate = DateTime.Now,&lt;/div&gt;
&lt;div style="margin: 0cm 0cm 0pt 10.5pt"&gt;InsertENTUserAccountId = 1,&lt;/div&gt;
&lt;div style="margin: 0cm 0cm 0pt 10.5pt"&gt;UpdateDate = DateTime.Now,&lt;/div&gt;
&lt;div style="margin: 0cm 0cm 0pt 10.5pt"&gt;UpdateENTUserAccountId = 1&lt;/div&gt;
&lt;div&gt;};&lt;/div&gt;
&lt;div&gt;//Signal the context to insert this record&lt;/div&gt;
&lt;div&gt;db.ENTUserAccounts.InsertOnSubmit(userAccount);&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;//Save the changes to the database&lt;/div&gt;
&lt;div&gt;db.SubmitChanges();&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;b&gt;为什么要这样设计呢？我不是很认同这种设计。&lt;/b&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;1. 任何对表ENTUserAccount的修改，都需要重新将EntUserAccount表拖拉到ORM设计器中，并重新设置Insert、Update、Delete 等等属性。&lt;/div&gt;
&lt;div&gt;2. 需要编写很多琐碎的存储过程，如上述的Insert、Update、Delete、Select等等，相信很多开发人员不喜欢编写这么多简单的Stored Procedure。&lt;/div&gt;
&lt;div&gt;3. 这样设计增加很多工作量，并且不便于后期的维护开发，也影响工作效率。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;本章后面部分定义的一些接口类、抽象基类是针对该项目设计的特性提取的一些共用特征。这种设计方法值得推荐，但并不一定适合于实际的开发项目。&lt;/div&gt;
&lt;div&gt;public interface IENTBaseEntity&lt;/div&gt;
&lt;div&gt;public abstract class ENTBaseData&amp;lt;T&amp;gt; where T : IENTBaseEntity&lt;/div&gt;
&lt;div&gt;在数据访问层DAL仅仅只有2个上述的基类。&lt;/div&gt;
&lt;div&gt;public class ENTUserAccountData : ENTBaseData&amp;lt;ENTUserAccount&amp;gt;&lt;/div&gt;
&lt;div&gt;上述的Data类封装出来ENTUserAccount实体对象，ENTUserAccountData类继承自ENTBaseData基类，实现基类中的抽象方法。&lt;/div&gt;
&lt;div&gt;ORM设计器负责为数据库中每一个表生成一个对应的实体类，对应Data类则负责与数据库和业务逻辑层交互。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;下一篇是关于业务逻辑层BLL的设计探讨。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;&lt;img src="http://blog.entlib.com/EntLib/aggbug/193.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>EntLib.com</dc:creator>
            <guid>http://blog.entlib.com/EntLib/archive/2009/06/11/asp.net-3.5-enterprise-application-development.aspx</guid>
            <pubDate>Thu, 11 Jun 2009 11:58:21 GMT</pubDate>
            <wfw:comment>http://blog.entlib.com/EntLib/comments/193.aspx</wfw:comment>
            <comments>http://blog.entlib.com/EntLib/archive/2009/06/11/asp.net-3.5-enterprise-application-development.aspx#feedback</comments>
            <slash:comments>7</slash:comments>
            <wfw:commentRss>http://blog.entlib.com/EntLib/comments/commentRss/193.aspx</wfw:commentRss>
        </item>
        <item>
            <title>WF 状态机工作流构建订单处理流程-范例程序分析 Part 2</title>
            <category>Workflow (WF)</category>
            <link>http://blog.entlib.com/EntLib/archive/2009/06/02/wf-part-2.aspx</link>
            <description>&lt;div align="center"&gt;&lt;b&gt;WF &lt;/b&gt;&lt;b&gt;状态机工作流构建订单处理流程-&lt;/b&gt;&lt;b&gt;范例程序分析 Part 2&lt;/b&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;状态机工作流（State Machine Workflow）是以状态的变化为驱动而进行业务流转的，且一定需要人为的干预，而不像顺序类型工作流（Sequential Workflow）那样按照事先设计好的业务流程一步一步依次执行下去。本范例程序由&lt;a href="http://forum.entlib.com/"&gt;http://forum.entlib.com&lt;/a&gt; 开源ASP.NET/C# 论坛小组提供。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;a href="http://blog.entlib.com/EntLib/archive/2009/03/23/wf-part-1.aspx"&gt;WF &lt;span&gt;&lt;span&gt;状态机工作流构建订单处理流程&lt;/span&gt;-&lt;span&gt;范例程序分析&lt;/span&gt; Part 1&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;b&gt;实现IOrder &lt;/b&gt;&lt;b&gt;接口&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;下面实现IOrder 接口，下面的代码Order类实现IOrder 接口。这里，仅仅在控制台显示一些简单的提示信息。该Order类将由Client端程序调用，其中内部的调用，将触发工作流中相应的活动。&lt;br /&gt;
 &lt;/div&gt;
&lt;div style="text-align: center"&gt;&lt;img alt="" width="609" height="318" src="/userfiles/EntLib/image/WF/WF_OrderWorkflow_Part2_1.gif" /&gt;&lt;br /&gt;
 &lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;b&gt;创建工作流实例&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;下面基于workflow runtime 创建并启动工作流实例，并添加Order 对象作为服务。&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: #2b91af"&gt;WorkflowInstance&lt;/span&gt; objWorkFlowInstance;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: #2b91af"&gt;WorkflowRuntime&lt;/span&gt; objWorkFlowRuntime = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;WorkflowRuntime&lt;/span&gt;();&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: #2b91af"&gt;Order&lt;/span&gt; objOrder = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Order&lt;/span&gt;();&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: #2b91af"&gt;ExternalDataExchangeService&lt;/span&gt; objService = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;ExternalDataExchangeService&lt;/span&gt;();&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: #2b91af"&gt;Guid&lt;/span&gt; InstanceId = &lt;span style="color: #2b91af"&gt;Guid&lt;/span&gt;.NewGuid();&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt; &lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            objWorkFlowRuntime.AddService(objService);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            objService.AddService(objOrder);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            objWorkFlowInstance = objWorkFlowRuntime.CreateWorkflow(&lt;span style="color: blue"&gt;typeof&lt;/span&gt;(OrderWorkFlow.&lt;span style="color: #2b91af"&gt;WorkflowOrder&lt;/span&gt;), &lt;span style="color: blue"&gt;null&lt;/span&gt;, InstanceId);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            objWorkFlowInstance.Start();&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: #a31515"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #a31515; font-size: 9pt"&gt;工作流启动啦 -- Work flow started"&lt;/span&gt;&lt;span style="font-size: 9pt"&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;下面是Client端调用代码，根据用户输入的数值，调用Order 对象的相应方法，触发工作流中相应的活动。&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: #2b91af"&gt;ExternalDataEventArgs&lt;/span&gt; objDataEventArgs = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;ExternalDataEventArgs&lt;/span&gt;(InstanceId);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            objDataEventArgs.WaitForIdle = &lt;span style="color: blue"&gt;true&lt;/span&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: #a31515"&gt;"1 - &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #a31515; font-size: 9pt"&gt;订单尚未付款"&lt;/span&gt;&lt;span style="font-size: 9pt"&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: #a31515"&gt;"2 - &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #a31515; font-size: 9pt"&gt;产品入库"&lt;/span&gt;&lt;span style="font-size: 9pt"&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: #a31515"&gt;"3 - &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #a31515; font-size: 9pt"&gt;对订单付款"&lt;/span&gt;&lt;span style="font-size: 9pt"&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: #a31515"&gt;"4 - &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #a31515; font-size: 9pt"&gt;订单发货"&lt;/span&gt;&lt;span style="font-size: 9pt"&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: #a31515"&gt;"5 - &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #a31515; font-size: 9pt"&gt;送货地址错误"&lt;/span&gt;&lt;span style="font-size: 9pt"&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: #a31515"&gt;"6 - &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #a31515; font-size: 9pt"&gt;送货地址正确"&lt;/span&gt;&lt;span style="font-size: 9pt"&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: #a31515"&gt;"7 - &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #a31515; font-size: 9pt"&gt;产品有库存"&lt;/span&gt;&lt;span style="font-size: 9pt"&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: #a31515"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #a31515; font-size: 9pt"&gt;请输入上述数字： "&lt;/span&gt;&lt;span style="font-size: 9pt"&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: blue"&gt;int&lt;/span&gt; intValueEntered=0;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            &lt;span style="color: blue"&gt;while&lt;/span&gt;(intValueEntered &amp;lt; 7)&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;            {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                intValueEntered = &lt;span style="color: #2b91af"&gt;Convert&lt;/span&gt;.ToInt16(&lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.ReadLine().ToString());&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                &lt;span style="color: blue"&gt;if&lt;/span&gt; (intValueEntered == 1)&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                    objOrder.CallNotPaid(objDataEventArgs);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                }&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                &lt;span style="color: blue"&gt;else&lt;/span&gt; &lt;span style="color: blue"&gt;if&lt;/span&gt; (intValueEntered == 2)&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                    objOrder.CallInStock(objDataEventArgs);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                }&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                &lt;span style="color: blue"&gt;else&lt;/span&gt; &lt;span style="color: blue"&gt;if&lt;/span&gt; (intValueEntered == 3)&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                    objOrder.CallPaymentMade(objDataEventArgs);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                }&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                &lt;span style="color: blue"&gt;else&lt;/span&gt; &lt;span style="color: blue"&gt;if&lt;/span&gt; (intValueEntered == 4)&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                    objOrder.CallDispatch(objDataEventArgs);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                }&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                &lt;span style="color: blue"&gt;else&lt;/span&gt; &lt;span style="color: blue"&gt;if&lt;/span&gt; (intValueEntered == 5)&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                    objOrder.CallAddressNotProper(objDataEventArgs);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                }&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                &lt;span style="color: blue"&gt;else&lt;/span&gt; &lt;span style="color: blue"&gt;if&lt;/span&gt; (intValueEntered == 6)&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                    objOrder.CallAddressCorrected(objDataEventArgs);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                }&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                &lt;span style="color: blue"&gt;else&lt;/span&gt; &lt;span style="color: blue"&gt;if&lt;/span&gt; (intValueEntered == 7)&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                    objOrder.CallProductStocked(objDataEventArgs);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 9pt"&gt;                }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="font-size: 9pt"&gt;            }&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;该工作流演示界面如下：&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div style="text-align: center"&gt;&lt;img alt="" width="677" height="440" src="/userfiles/EntLib/image/WF/WF_OrderWorkflow_Part2_2.gif" /&gt;&lt;br /&gt;
 &lt;/div&gt;
&lt;div&gt;欢迎下载该范例程序源代码。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;&lt;img src="http://blog.entlib.com/EntLib/aggbug/192.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>EntLib.com</dc:creator>
            <guid>http://blog.entlib.com/EntLib/archive/2009/06/02/wf-part-2.aspx</guid>
            <pubDate>Tue, 02 Jun 2009 11:43:20 GMT</pubDate>
            <wfw:comment>http://blog.entlib.com/EntLib/comments/192.aspx</wfw:comment>
            <comments>http://blog.entlib.com/EntLib/archive/2009/06/02/wf-part-2.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://blog.entlib.com/EntLib/comments/commentRss/192.aspx</wfw:commentRss>
            <enclosure url="http://blog.entlib.com/userfiles/EntLib/file/EntLib_OrderWorkFlow.zip" length="111" type="application/octetstream" />
        </item>
        <item>
            <title>SQL Server XML 代码编写示例</title>
            <category>SQL Server &amp; Service Broker</category>
            <link>http://blog.entlib.com/EntLib/archive/2009/05/16/sql-server-xml.aspx</link>
            <description>&lt;div align="center"&gt;&lt;b&gt;SQL Server XML &lt;/b&gt;&lt;b&gt;代码编写示例&lt;/b&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;XML 数据类型有很多内置的方法，这些方法只针对XML数据类型。比较常用的有.query、.value、.modify、.nodes、.exist 等等方法。本文中所有的SQL 脚本范例都基于AdventureWorks 数据库进行过测试。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;b&gt;&lt;span style="font-size: 14pt"&gt;(1) .query &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="font-size: 14pt"&gt;方法&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;允许用户通过运行基于XQuery 格式化的查询来访问XML。XQuery 允许返回多个数据片段，而不是一个离散的值。.Query要求一个参数，运行在XML数据实例之上有效的XQuery。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;如下是提取Production.ProductModel 表中ProductModelID 为 66 的产品文档：&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 10pt"&gt;Select&lt;/span&gt;&lt;span style="font-size: 10pt"&gt; &lt;span style="color: teal"&gt;ProductModelID&lt;/span&gt;&lt;span style="color: gray"&gt;,&lt;/span&gt; &lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 10pt"&gt;    &lt;span style="color: teal"&gt;Instructions&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;query&lt;/span&gt;&lt;span style="color: gray"&gt;(&lt;/span&gt;&lt;span style="color: red"&gt;'declare namespace PI="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions"; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: red; font-size: 10pt"&gt;    /PI:root/PI:Location/PI:step'&lt;/span&gt;&lt;span style="color: gray; font-size: 10pt"&gt;)&lt;/span&gt;&lt;span style="font-size: 10pt"&gt; &lt;span style="color: blue"&gt;AS&lt;/span&gt; &lt;span style="color: teal"&gt;Steps&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 10pt"&gt;From&lt;/span&gt;&lt;span style="font-size: 10pt"&gt; &lt;span style="color: teal"&gt;Production&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;ProductModel&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 10pt"&gt;where&lt;/span&gt;&lt;span style="font-size: 10pt"&gt; &lt;span style="color: teal"&gt;ProductModelID&lt;/span&gt;&lt;span style="color: gray"&gt;=&lt;/span&gt;66&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt; &lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 10pt"&gt;Select&lt;/span&gt;&lt;span style="font-size: 10pt"&gt; &lt;span style="color: teal"&gt;ProductModelID&lt;/span&gt;&lt;span style="color: gray"&gt;,&lt;/span&gt; &lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 10pt"&gt;    &lt;span style="color: teal"&gt;Instructions&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;query&lt;/span&gt;&lt;span style="color: gray"&gt;(&lt;/span&gt;&lt;span style="color: red"&gt;'declare default element namespace "http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions"; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: red; font-size: 10pt"&gt;    /root/Location/step'&lt;/span&gt;&lt;span style="color: gray; font-size: 10pt"&gt;)&lt;/span&gt;&lt;span style="font-size: 10pt"&gt; &lt;span style="color: blue"&gt;AS&lt;/span&gt; &lt;span style="color: teal"&gt;Steps&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 10pt"&gt;From&lt;/span&gt;&lt;span style="font-size: 10pt"&gt; &lt;span style="color: teal"&gt;Production&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;ProductModel&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 10pt"&gt;where&lt;/span&gt;&lt;span style="font-size: 10pt"&gt; &lt;span style="color: teal"&gt;ProductModelID&lt;/span&gt;&lt;span style="color: gray"&gt;=&lt;/span&gt;66&lt;/span&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;上述2个SQL 脚本在定义XML namespace有一些细微的差异，可以比较一下执行产生的结果。也可以在 XQuery 之外使用 With XMLNamespaces ('http://xxx' as XX)，提高XML 查询的可读性。上述代码通过WITH XMLNamespaces() 声明编写功能相同的代码：&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: gray; font-size: 10pt"&gt;;&lt;/span&gt;&lt;span style="color: blue; font-size: 10pt"&gt;WITH&lt;/span&gt;&lt;span style="font-size: 10pt"&gt; &lt;span style="color: teal"&gt;XMLNAMESPACES&lt;/span&gt;&lt;span style="color: gray"&gt;(&lt;/span&gt;&lt;span style="color: red"&gt;'http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions'&lt;/span&gt; &lt;span style="color: blue"&gt;AS&lt;/span&gt; &lt;span style="color: fuchsia"&gt;PI&lt;/span&gt;&lt;span style="color: gray"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt; &lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 10pt"&gt;Select&lt;/span&gt;&lt;span style="font-size: 10pt"&gt; &lt;span style="color: teal"&gt;ProductModelID&lt;/span&gt;&lt;span style="color: gray"&gt;,&lt;/span&gt; &lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 10pt"&gt;    &lt;span style="color: teal"&gt;Instructions&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;query&lt;/span&gt;&lt;span style="color: gray"&gt;(&lt;/span&gt;&lt;span style="color: red"&gt;'/PI:root/PI:Location/PI:step'&lt;/span&gt;&lt;span style="color: gray"&gt;)&lt;/span&gt; &lt;span style="color: blue"&gt;AS&lt;/span&gt; &lt;span style="color: teal"&gt;Steps&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 10pt"&gt;From&lt;/span&gt;&lt;span style="font-size: 10pt"&gt; &lt;span style="color: teal"&gt;Production&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;ProductModel&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 10pt"&gt;where&lt;/span&gt;&lt;span style="font-size: 10pt"&gt; &lt;span style="color: teal"&gt;ProductModelID&lt;/span&gt;&lt;span style="color: gray"&gt;=&lt;/span&gt;66&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt; &lt;/div&gt;
&lt;div align="left"&gt;设置默认命名空间：&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: gray; font-size: 10pt"&gt;;&lt;/span&gt;&lt;span style="color: blue; font-size: 10pt"&gt;WITH&lt;/span&gt;&lt;span style="font-size: 10pt"&gt; &lt;span style="color: teal"&gt;XMLNAMESPACES&lt;/span&gt;&lt;span style="color: gray"&gt;(&lt;/span&gt;&lt;span style="color: blue"&gt;DEFAULT&lt;/span&gt; &lt;span style="color: red"&gt;'http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions'&lt;/span&gt;&lt;span style="color: gray"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt; &lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 10pt"&gt;Select&lt;/span&gt;&lt;span style="font-size: 10pt"&gt; &lt;span style="color: teal"&gt;ProductModelID&lt;/span&gt;&lt;span style="color: gray"&gt;,&lt;/span&gt; &lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 10pt"&gt;    &lt;span style="color: teal"&gt;Instructions&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;query&lt;/span&gt;&lt;span style="color: gray"&gt;(&lt;/span&gt;&lt;span style="color: red"&gt;'/root/Location/step'&lt;/span&gt;&lt;span style="color: gray"&gt;)&lt;/span&gt; &lt;span style="color: blue"&gt;AS&lt;/span&gt; &lt;span style="color: teal"&gt;Steps&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 10pt"&gt;From&lt;/span&gt;&lt;span style="font-size: 10pt"&gt; &lt;span style="color: teal"&gt;Production&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;ProductModel&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color: blue; font-size: 10pt"&gt;where&lt;/span&gt;&lt;span style="font-size: 10pt"&gt; &lt;span style="color: teal"&gt;ProductModelID&lt;/span&gt;&lt;span style="color: gray"&gt;=&lt;/span&gt;66&lt;/span&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;b&gt;&lt;span style="font-size: 14pt"&gt;(2) .value &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="font-size: 14pt"&gt;方法&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;是查询离散数据的方法，使用一个XPath 的语法来定位指定的结点，并得到标量值。需要确保指定的XPath 真正返回一个离散值。&lt;/div&gt;
&lt;div&gt;查询ProductModelID为 66 的第一个Location元素中LabelHours 属性的值。&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: gray; font-size: 10pt"&gt;;&lt;/span&gt;&lt;span style="color: blue; font-size: 10pt"&gt;WITH&lt;/span&gt;&lt;span style="font-size: 10pt"&gt; &lt;span style="color: teal"&gt;XMLNAMESPACES&lt;/span&gt;&lt;span style="color: gray"&gt;(&lt;/span&gt;&lt;span style="color: blue"&gt;DEFAULT&lt;/span&gt; &lt;span style="color: red"&gt;'http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions'&lt;/span&gt;&lt;span style="color: gray"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt; &lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 10pt"&gt;Select&lt;/span&gt;&lt;span style="font-size: 10pt"&gt; &lt;span style="color: teal"&gt;ProductModelID&lt;/span&gt;&lt;span style="color: gray"&gt;,&lt;/span&gt; &lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 10pt"&gt;    &lt;span style="color: teal"&gt;Instructions&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;value&lt;/span&gt;&lt;span style="color: gray"&gt;(&lt;/span&gt;&lt;span style="color: red"&gt;'(/root/Location/@LaborHours)[1]'&lt;/span&gt;&lt;span style="color: gray"&gt;,&lt;/span&gt; &lt;span style="color: red"&gt;'decimal (5,2)'&lt;/span&gt;&lt;span style="color: gray"&gt;)&lt;/span&gt; &lt;span style="color: blue"&gt;AS&lt;/span&gt; &lt;span style="color: teal"&gt;Steps&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 10pt"&gt;From&lt;/span&gt;&lt;span style="font-size: 10pt"&gt; &lt;span style="color: teal"&gt;Production&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;ProductModel&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 10pt"&gt;where&lt;/span&gt;&lt;span style="font-size: 10pt"&gt; &lt;span style="color: teal"&gt;ProductModelID&lt;/span&gt;&lt;span style="color: gray"&gt;=&lt;/span&gt;66&lt;/span&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;如果不是属性，而是子元素，则应该去掉@符号。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;b&gt;&lt;span style="font-size: 14pt"&gt;(3) .modify &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="font-size: 14pt"&gt;方法&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;是对XQuery 的扩展，以提供XQuery 的数据修改能力。这种对XQuery的扩展称作XML数据处理语言（XML Data Manipulation Language），或者XML DML。XML DML向XQuery 中添加了3条新命令：insert / delete / replace value of。其中replace value of 替代了SQL的UPDATE语句。&lt;/div&gt;
&lt;div&gt;例如，将上述查询的LabelHours属性值，由原来的1.5小时更新为1.75小时。&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: gray; font-size: 10pt"&gt;;&lt;/span&gt;&lt;span style="color: blue; font-size: 10pt"&gt;WITH&lt;/span&gt;&lt;span style="font-size: 10pt"&gt; &lt;span style="color: teal"&gt;XMLNAMESPACES&lt;/span&gt;&lt;span style="color: gray"&gt;(&lt;/span&gt;&lt;span style="color: blue"&gt;DEFAULT&lt;/span&gt; &lt;span style="color: red"&gt;'http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions'&lt;/span&gt;&lt;span style="color: gray"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt; &lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 10pt"&gt;UPDATE&lt;/span&gt;&lt;span style="font-size: 10pt"&gt; &lt;span style="color: teal"&gt;Production&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;ProductModel&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 10pt"&gt;SET&lt;/span&gt;&lt;span style="font-size: 10pt"&gt; &lt;span style="color: teal"&gt;Instructions&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: blue"&gt;modify&lt;/span&gt;&lt;span style="color: gray"&gt;(&lt;/span&gt;&lt;span style="color: red"&gt;'replace value of (/root/Location/@LaborHours)[1] with 1.75'&lt;/span&gt;&lt;span style="color: gray"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color: blue; font-size: 10pt"&gt;WHERE&lt;/span&gt;&lt;span style="font-size: 10pt"&gt; &lt;span style="color: teal"&gt;ProductModelID&lt;/span&gt;&lt;span style="color: gray"&gt;=&lt;/span&gt;66&lt;/span&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;在UPDATE语句中，使用 replace value of 关键字来指定更新中的XML部分。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;b&gt;&lt;span style="font-size: 14pt"&gt;(4) .nodes &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="font-size: 14pt"&gt;方法&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;用来获取XML块，并将之拆分多个数据行，以关系的形式存储。通过.nodes 所做的工作，本质上是将一个XML 数据的实例拆分到自己的表中。这意味着，我们需要将.nodes 的结果作为一个表，而不是一个列来看待。在.nodes 和一个数据库表之间的主要差别是，必须将.nodes 的结果交叉应用（cross apply）回指定的XML数据的来源表中。可以将cross apply 想象成某种连接，只不过使用的是cross apply关键字，而不是JOIN关键字，并且.nodes 替代了ON子句。&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: gray; font-size: 10pt"&gt;;&lt;/span&gt;&lt;span style="color: blue; font-size: 10pt"&gt;WITH&lt;/span&gt;&lt;span style="font-size: 10pt"&gt; &lt;span style="color: teal"&gt;XMLNAMESPACES&lt;/span&gt;&lt;span style="color: gray"&gt;(&lt;/span&gt;&lt;span style="color: blue"&gt;DEFAULT&lt;/span&gt; &lt;span style="color: red"&gt;'http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions'&lt;/span&gt;&lt;span style="color: gray"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt; &lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 10pt"&gt;SELECT&lt;/span&gt;&lt;span style="font-size: 10pt"&gt; &lt;span style="color: teal"&gt;pm&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;ProductModelID&lt;/span&gt;&lt;span style="color: gray"&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 10pt"&gt;    &lt;span style="color: teal"&gt;pmi&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;Location&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;value&lt;/span&gt;&lt;span style="color: gray"&gt;(&lt;/span&gt;&lt;span style="color: red"&gt;'./@LocationID'&lt;/span&gt;&lt;span style="color: gray"&gt;,&lt;/span&gt; &lt;span style="color: red"&gt;'int'&lt;/span&gt;&lt;span style="color: gray"&gt;)&lt;/span&gt; &lt;span style="color: blue"&gt;AS&lt;/span&gt; &lt;span style="color: teal"&gt;LocationID&lt;/span&gt;&lt;span style="color: gray"&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 10pt"&gt;    &lt;span style="color: teal"&gt;pmi&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;Location&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;value&lt;/span&gt;&lt;span style="color: gray"&gt;(&lt;/span&gt;&lt;span style="color: red"&gt;'./@LaborHours'&lt;/span&gt;&lt;span style="color: gray"&gt;,&lt;/span&gt; &lt;span style="color: red"&gt;'decimal(5,2)'&lt;/span&gt;&lt;span style="color: gray"&gt;)&lt;/span&gt; &lt;span style="color: blue"&gt;AS&lt;/span&gt; &lt;span style="color: teal"&gt;LaborHours&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 10pt"&gt;FROM&lt;/span&gt;&lt;span style="font-size: 10pt"&gt; &lt;span style="color: teal"&gt;Production&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;ProductModel&lt;/span&gt; &lt;span style="color: teal"&gt;pm&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color: gray; font-size: 10pt"&gt;CROSS&lt;/span&gt;&lt;span style="font-size: 10pt"&gt; &lt;span style="color: gray"&gt;APPLY&lt;/span&gt; &lt;span style="color: teal"&gt;pm&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;Instructions&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;nodes&lt;/span&gt;&lt;span style="color: gray"&gt;(&lt;/span&gt;&lt;span style="color: red"&gt;'/root/Location'&lt;/span&gt;&lt;span style="color: gray"&gt;)&lt;/span&gt; &lt;span style="color: blue"&gt;AS&lt;/span&gt; &lt;span style="color: teal"&gt;pmi&lt;/span&gt;&lt;span style="color: gray"&gt;(&lt;/span&gt;&lt;span style="color: teal"&gt;Location&lt;/span&gt;&lt;span style="color: gray"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;将LocationID和LaborHours 信息拆分到列上，就好像它们位于关系表中一样。通过使用.nodes 方法，本质上将一个表 ProductModel 转换成了2个表（源表，以及ProductModel表中的Instructions 列所生成的.nodes 结果）。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;下面的范例脚本将Instructions XML数据中material 子节点的数据库取出，转为以数据表n的字段 c 来显示，其中字段c 的数据类型也是XML，进一步取出c的值，并转换为nvarchar数据类型。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 10pt"&gt;DECLARE&lt;/span&gt;&lt;span style="font-size: 10pt"&gt; &lt;span style="color: teal"&gt;@xml&lt;/span&gt; &lt;span style="color: blue"&gt;XML&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 10pt"&gt;SELECT&lt;/span&gt;&lt;span style="font-size: 10pt"&gt; &lt;span style="color: teal"&gt;@xml&lt;/span&gt;&lt;span style="color: gray"&gt;=&lt;/span&gt;&lt;span style="color: teal"&gt;Instructions&lt;/span&gt; &lt;span style="color: blue"&gt;FROM&lt;/span&gt; &lt;span style="color: teal"&gt;Production&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;ProductModel&lt;/span&gt; &lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 10pt"&gt;WHERE&lt;/span&gt;&lt;span style="font-size: 10pt"&gt; &lt;span style="color: teal"&gt;ProductModelID&lt;/span&gt;&lt;span style="color: gray"&gt;=&lt;/span&gt;66&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt; &lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: gray; font-size: 10pt"&gt;;&lt;/span&gt;&lt;span style="color: blue; font-size: 10pt"&gt;WITH&lt;/span&gt;&lt;span style="font-size: 10pt"&gt; &lt;span style="color: teal"&gt;XMLNAMESPACES&lt;/span&gt;&lt;span style="color: gray"&gt;(&lt;/span&gt;&lt;span style="color: red"&gt;'http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions'&lt;/span&gt; &lt;span style="color: blue"&gt;AS&lt;/span&gt; &lt;span style="color: teal"&gt;ns&lt;/span&gt;&lt;span style="color: gray"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt; &lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 10pt"&gt;SELECT&lt;/span&gt;&lt;span style="font-size: 10pt"&gt; &lt;span style="color: teal"&gt;c&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;value&lt;/span&gt;&lt;span style="color: gray"&gt;(&lt;/span&gt;&lt;span style="color: red"&gt;'.'&lt;/span&gt;&lt;span style="color: gray"&gt;,&lt;/span&gt;&lt;span style="color: red"&gt;'nvarchar(max)'&lt;/span&gt;&lt;span style="color: gray"&gt;)&lt;/span&gt; &lt;span style="color: blue"&gt;AS&lt;/span&gt; &lt;span style="color: teal"&gt;NewCol&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color: blue; font-size: 10pt"&gt;FROM&lt;/span&gt;&lt;span style="font-size: 10pt"&gt; &lt;span style="color: teal"&gt;@xml&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;nodes&lt;/span&gt;&lt;span style="color: gray"&gt;(&lt;/span&gt;&lt;span style="color: red"&gt;'/ns:root/ns:Location/ns:step/ns:material'&lt;/span&gt;&lt;span style="color: gray"&gt;)&lt;/span&gt; &lt;span style="color: blue"&gt;as&lt;/span&gt; &lt;span style="color: teal"&gt;n&lt;/span&gt;&lt;span style="color: gray"&gt;(&lt;/span&gt;&lt;span style="color: teal"&gt;c&lt;/span&gt;&lt;span style="color: gray"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div style="text-align: center"&gt;&lt;img width="524" height="179" alt="" src="/userfiles/EntLib/image/SQLServer/SQLServer_XML_1.gif" /&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;b&gt;&lt;span style="font-size: 14pt"&gt;(5) .exist &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="font-size: 14pt"&gt;方法&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;.exist 方法有点像SQL中的EXISTS 语句，接受一个XQuery 表达式，并返回一个布尔值。&lt;/div&gt;
&lt;div&gt;查询Instructions XML数据中存在LaborHours属性的数据记录。&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: gray; font-size: 10pt"&gt;;&lt;/span&gt;&lt;span style="color: blue; font-size: 10pt"&gt;WITH&lt;/span&gt;&lt;span style="font-size: 10pt"&gt; &lt;span style="color: teal"&gt;XMLNAMESPACES&lt;/span&gt;&lt;span style="color: gray"&gt;(&lt;/span&gt;&lt;span style="color: blue"&gt;DEFAULT&lt;/span&gt; &lt;span style="color: red"&gt;'http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions'&lt;/span&gt;&lt;span style="color: gray"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt; &lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 10pt"&gt;SELECT&lt;/span&gt;&lt;span style="font-size: 10pt"&gt; &lt;span style="color: teal"&gt;ProductModelID&lt;/span&gt;&lt;span style="color: gray"&gt;,&lt;/span&gt; &lt;span style="color: teal"&gt;Instructions&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;value&lt;/span&gt;&lt;span style="color: gray"&gt;(&lt;/span&gt;&lt;span style="color: red"&gt;'(/root/Location/@LaborHours)[1]'&lt;/span&gt;&lt;span style="color: gray"&gt;,&lt;/span&gt;&lt;span style="color: red"&gt;'decimal(5,2)'&lt;/span&gt;&lt;span style="color: gray"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 10pt"&gt;FROM&lt;/span&gt;&lt;span style="font-size: 10pt"&gt; &lt;span style="color: teal"&gt;Production&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;ProductModel&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 10pt"&gt;WHERE&lt;/span&gt;&lt;span style="font-size: 10pt"&gt; &lt;span style="color: teal"&gt;Instructions&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;exist&lt;/span&gt;&lt;span style="color: gray"&gt;(&lt;/span&gt;&lt;span style="color: red"&gt;'/root/Location/@LaborHours'&lt;/span&gt;&lt;span style="color: gray"&gt;)=&lt;/span&gt;1&lt;/span&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;总结一下SQL Server 2005/2008 为XML数据类型提供的函数：&lt;/div&gt;
&lt;div style="text-align: center"&gt;&lt;img width="607" height="163" alt="" src="/userfiles/EntLib/image/SQLServer/SQLServer_XML_2.gif" /&gt;&lt;br /&gt;
 &lt;/div&gt;&lt;img src="http://blog.entlib.com/EntLib/aggbug/191.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>EntLib.com</dc:creator>
            <guid>http://blog.entlib.com/EntLib/archive/2009/05/16/sql-server-xml.aspx</guid>
            <pubDate>Sat, 16 May 2009 02:11:59 GMT</pubDate>
            <wfw:comment>http://blog.entlib.com/EntLib/comments/191.aspx</wfw:comment>
            <comments>http://blog.entlib.com/EntLib/archive/2009/05/16/sql-server-xml.aspx#feedback</comments>
            <wfw:commentRss>http://blog.entlib.com/EntLib/comments/commentRss/191.aspx</wfw:commentRss>
        </item>
        <item>
            <title>SQL Server 高级查询 – 学习笔记</title>
            <category>SQL Server &amp; Service Broker</category>
            <link>http://blog.entlib.com/EntLib/archive/2009/04/29/sql-server.aspx</link>
            <description>&lt;div align="center"&gt;&lt;b&gt;SQL Server &lt;/b&gt;&lt;b&gt;高级查询 – &lt;/b&gt;&lt;b&gt;学习笔记&lt;/b&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;本文是《SQL Server 2005 高级程序设计》, Professional SQL Server 2005 Programming – 第六章：高级查询的学习笔记。主要包含如下内容：&lt;/div&gt;
&lt;div&gt;1. 嵌套的子查询；&lt;/div&gt;
&lt;div&gt;2. 相关子查询；&lt;/div&gt;
&lt;div&gt;3. 派生表；&lt;/div&gt;
&lt;div&gt;4. EXISTS 运算符的使用；&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;大部分的子查询（当然不是全部）也能够用联接（Join）来实现，关于联接和子查询的性能比较，需要具体分析。本文所有的范例SQL 脚本使用&lt;a href="http://forum.entlib.com/Default.aspx?g=posts&amp;amp;t=394"&gt;&lt;font color="#0000ff"&gt;AdventureWorks &lt;span&gt;&lt;span&gt;数据库&lt;/span&gt;&lt;/span&gt;。&lt;/font&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;b&gt;1. &lt;/b&gt;&lt;b&gt;构建嵌套的子查询&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;嵌套的子查询（nested subquery） - 要么返回一个用于外部查询的值，要么返回一个与IN运算符一起使用的值的列表。当想要明确使用 = 运算符时，则使用返回一个值的查询，也就是从一行返回一列。如果要返回一个列表，则必须在外部查询中使用 IN 运算符。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;b&gt;（1&lt;/b&gt;&lt;b&gt;）创建使用单值的嵌套子查询&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;查询系统中购买产品的第一天所销售的所有产品项的ProductID，SQL 脚本如下：&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 10pt"&gt;SELECT&lt;/span&gt;&lt;span style="font-size: 10pt"&gt; &lt;span style="color: blue"&gt;DISTINCT&lt;/span&gt; &lt;span style="color: teal"&gt;soh&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;OrderDate&lt;/span&gt;&lt;span style="color: gray"&gt;,&lt;/span&gt; &lt;span style="color: teal"&gt;sod&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;ProductID&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 10pt"&gt;FROM&lt;/span&gt;&lt;span style="font-size: 10pt"&gt; &lt;span style="color: teal"&gt;Sales&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;SalesOrderHeader&lt;/span&gt; &lt;span style="color: teal"&gt;soh&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: gray; font-size: 10pt"&gt;JOIN&lt;/span&gt;&lt;span style="font-size: 10pt"&gt; &lt;span style="color: teal"&gt;Sales&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;SalesOrderDetail&lt;/span&gt; &lt;span style="color: teal"&gt;sod&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 10pt"&gt; &lt;span style="color: blue"&gt;ON&lt;/span&gt; &lt;span style="color: teal"&gt;soh&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;SalesOrderID&lt;/span&gt; &lt;span style="color: gray"&gt;=&lt;/span&gt; &lt;span style="color: teal"&gt;sod&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;SalesOrderID&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 10pt"&gt;WHERE&lt;/span&gt;&lt;span style="font-size: 10pt"&gt; &lt;span style="color: teal"&gt;soh&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;OrderDate&lt;/span&gt; &lt;span style="color: gray"&gt;=&lt;/span&gt;&lt;span style="color: gray"&gt;(&lt;/span&gt;&lt;span style="color: blue"&gt;SELECT&lt;/span&gt; &lt;span style="color: fuchsia"&gt;MIN&lt;/span&gt;&lt;span style="color: gray"&gt;(&lt;/span&gt;&lt;span style="color: teal"&gt;OrderDate&lt;/span&gt;&lt;span style="color: gray"&gt;)&lt;/span&gt; &lt;span style="color: blue"&gt;FROM&lt;/span&gt; &lt;span style="color: teal"&gt;Sales&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;SalesOrderHeader&lt;/span&gt;&lt;span style="color: gray"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;内部查询（&lt;span style="color: blue; font-size: 10pt"&gt;SELECT&lt;/span&gt;&lt;span style="font-size: 10pt"&gt; &lt;span style="color: fuchsia"&gt;MIN&lt;/span&gt;&lt;span style="color: gray"&gt;(&lt;/span&gt;&lt;span style="color: teal"&gt;OrderDate&lt;/span&gt;&lt;span style="color: gray"&gt;)&lt;/span&gt; &lt;span style="color: blue"&gt;FROM&lt;/span&gt; &lt;span style="color: teal"&gt;Sales&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;SalesOrderHeader&lt;/span&gt;&lt;/span&gt;）获取一个值，该值将在外部查询中使用。由于这里使用了 = ，因此内部查询只能返回一个值，也就是一行中返回一列，否则将在运行时产生错误。&lt;br /&gt;
 &lt;/div&gt;
&lt;div style="text-align: center"&gt;&lt;img width="673" height="362" alt="" src="/userfiles/EntLib/image/SQLServer/ProSQLServer2005_Programming_1.gif" /&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;b&gt;（2&lt;/b&gt;&lt;b&gt;）创建返回多个值列表的嵌套子查询&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;在实际的应用中，最常见的是这种子查询，返回某种类型的范围列表，并在查询中作为一种判断标准来使用。&lt;/div&gt;
&lt;div&gt;下面查询条件：查询应征了公司另一个职位的所有雇员的列表。&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 10pt"&gt;SELECT&lt;/span&gt;&lt;span style="font-size: 10pt"&gt; &lt;span style="color: teal"&gt;e&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;EmployeeID&lt;/span&gt;&lt;span style="color: gray"&gt;,&lt;/span&gt; &lt;span style="color: teal"&gt;FirstName&lt;/span&gt;&lt;span style="color: gray"&gt;,&lt;/span&gt; &lt;span style="color: teal"&gt;LastName&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 10pt"&gt;FROM&lt;/span&gt;&lt;span style="font-size: 10pt"&gt; &lt;span style="color: teal"&gt;HumanResources&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;Employee&lt;/span&gt; &lt;span style="color: teal"&gt;e&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: gray; font-size: 10pt"&gt;JOIN&lt;/span&gt;&lt;span style="font-size: 10pt"&gt; &lt;span style="color: teal"&gt;Person&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;Contact&lt;/span&gt; &lt;span style="color: teal"&gt;c&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 10pt"&gt; &lt;span style="color: blue"&gt;ON&lt;/span&gt; &lt;span style="color: teal"&gt;e&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;ContactID&lt;/span&gt; &lt;span style="color: gray"&gt;=&lt;/span&gt; &lt;span style="color: teal"&gt;c&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;ContactID&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 10pt"&gt;WHERE&lt;/span&gt;&lt;span style="font-size: 10pt"&gt; &lt;span style="color: teal"&gt;e&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;EmployeeID&lt;/span&gt; &lt;span style="color: gray"&gt;IN&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color: blue; font-size: 10pt"&gt; &lt;/span&gt;&lt;span style="color: gray; font-size: 10pt"&gt;(&lt;/span&gt;&lt;span style="color: blue; font-size: 10pt"&gt;SELECT&lt;/span&gt;&lt;span style="font-size: 10pt"&gt; &lt;span style="color: blue"&gt;DISTINCT&lt;/span&gt; &lt;span style="color: teal"&gt;EmployeeID&lt;/span&gt; &lt;span style="color: blue"&gt;FROM&lt;/span&gt; &lt;span style="color: teal"&gt;HumanResources&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;JobCandidate&lt;/span&gt;&lt;span style="color: gray"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;上述代码返回2条记录：&lt;br /&gt;
 &lt;/div&gt;
&lt;div style="text-align: center"&gt;&lt;img width="615" height="256" alt="" src="/userfiles/EntLib/image/SQLServer/ProSQLServer2005_Programming_2.gif" /&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;上述的查询脚本也可以使用内部联接而非嵌套的子查询来实现，脚本如下所示：&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 10pt"&gt;SELECT&lt;/span&gt;&lt;span style="font-size: 10pt"&gt; &lt;span style="color: teal"&gt;e&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;EmployeeID&lt;/span&gt;&lt;span style="color: gray"&gt;,&lt;/span&gt; &lt;span style="color: teal"&gt;FirstName&lt;/span&gt;&lt;span style="color: gray"&gt;,&lt;/span&gt; &lt;span style="color: teal"&gt;LastName&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 10pt"&gt;FROM&lt;/span&gt;&lt;span style="font-size: 10pt"&gt; &lt;span style="color: teal"&gt;HumanResources&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;Employee&lt;/span&gt; &lt;span style="color: teal"&gt;e&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: gray; font-size: 10pt"&gt;JOIN&lt;/span&gt;&lt;span style="font-size: 10pt"&gt; &lt;span style="color: teal"&gt;Person&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;Contact&lt;/span&gt; &lt;span style="color: teal"&gt;c&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 10pt"&gt; &lt;span style="color: blue"&gt;ON&lt;/span&gt; &lt;span style="color: teal"&gt;e&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;ContactID&lt;/span&gt; &lt;span style="color: gray"&gt;=&lt;/span&gt; &lt;span style="color: teal"&gt;c&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;ContactID&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: gray; font-size: 10pt"&gt;JOIN&lt;/span&gt;&lt;span style="font-size: 10pt"&gt; &lt;span style="color: teal"&gt;HumanResources&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;JobCandidate&lt;/span&gt; &lt;span style="color: teal"&gt;jc&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="font-size: 10pt"&gt; &lt;span style="color: blue"&gt;on&lt;/span&gt; &lt;span style="color: teal"&gt;jc&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;EmployeeID&lt;/span&gt; &lt;span style="color: gray"&gt;=&lt;/span&gt; &lt;span style="color: teal"&gt;e&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;EmployeeID&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;b&gt;2. &lt;/b&gt;&lt;b&gt;构建相关子查询&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;相关子查询与前面的嵌套子查询的不同之处在于，在相关子查询中，信息是双向而非单向的。在嵌套子查询中，内部查询只处理一次，信息被传出以用于外部查询，外部查询也只执行一次。&lt;/div&gt;
&lt;div&gt;在相关子查询中，按以下3个步骤来进行：&lt;/div&gt;
&lt;div&gt;（1）外部查询得到一条记录并将其传入到内部查询。&lt;/div&gt;
&lt;div&gt;（2）内部查询基于传入的值执行。&lt;/div&gt;
&lt;div&gt;（3）内部查询从其结果中把值传回到外部查询，外部查询使用这些值来完成其处理。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;b&gt;WHERE &lt;/b&gt;&lt;b&gt;子句中的相关子查询&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;查询每一位顾客在系统中的第一张订单中的OrderID 和 OrderDate，也就是要知道顾客在第一天下订单的日期和订单的ID。&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 10pt"&gt;SELECT&lt;/span&gt;&lt;span style="font-size: 10pt"&gt; &lt;span style="color: teal"&gt;soh&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;SalesOrderID&lt;/span&gt;&lt;span style="color: gray"&gt;,&lt;/span&gt; &lt;span style="color: teal"&gt;soh&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;OrderDate&lt;/span&gt;&lt;span style="color: gray"&gt;,&lt;/span&gt; &lt;span style="color: teal"&gt;soh&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;CustomerID&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 10pt"&gt;FROM&lt;/span&gt;&lt;span style="font-size: 10pt"&gt; &lt;span style="color: teal"&gt;Sales&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;SalesOrderHeader&lt;/span&gt; &lt;span style="color: teal"&gt;soh&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 10pt"&gt;WHERE&lt;/span&gt;&lt;span style="font-size: 10pt"&gt; &lt;span style="color: teal"&gt;soh&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;OrderDate&lt;/span&gt;&lt;span style="color: gray"&gt;=(&lt;/span&gt;&lt;span style="color: blue"&gt;SELECT&lt;/span&gt; &lt;span style="color: fuchsia"&gt;MIN&lt;/span&gt;&lt;span style="color: gray"&gt;(&lt;/span&gt;&lt;span style="color: teal"&gt;soh2&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;OrderDate&lt;/span&gt;&lt;span style="color: gray"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 10pt"&gt;                  &lt;span style="color: blue"&gt;FROM&lt;/span&gt; &lt;span style="color: teal"&gt;Sales&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;SalesOrderHeader&lt;/span&gt; &lt;span style="color: teal"&gt;soh2&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 10pt"&gt;                  &lt;span style="color: blue"&gt;WHERE&lt;/span&gt; &lt;span style="color: teal"&gt;soh2&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;CustomerID&lt;/span&gt; &lt;span style="color: gray"&gt;=&lt;/span&gt; &lt;span style="color: teal"&gt;soh&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;CustomerID&lt;/span&gt;&lt;span style="color: gray"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color: blue; font-size: 10pt"&gt;ORDER&lt;/span&gt;&lt;span style="font-size: 10pt"&gt; &lt;span style="color: blue"&gt;BY&lt;/span&gt; &lt;span style="color: teal"&gt;CustomerID&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;b&gt;SELECT &lt;/b&gt;&lt;b&gt;列表中的相关子查询&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;查询顾客的名字以及首次订购的日期。因为要获得顾客的名字，这意味着必须用到Person.Contact表，另外还需要知道第一次订购的日期。&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 10pt"&gt;SELECT&lt;/span&gt;&lt;span style="font-size: 10pt"&gt; &lt;span style="color: teal"&gt;c&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;LastName&lt;/span&gt;&lt;span style="color: gray"&gt;,&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: gray; font-size: 10pt"&gt;(&lt;/span&gt;&lt;span style="color: blue; font-size: 10pt"&gt;SELECT&lt;/span&gt;&lt;span style="font-size: 10pt"&gt; &lt;span style="color: fuchsia"&gt;MIN&lt;/span&gt;&lt;span style="color: gray"&gt;(&lt;/span&gt;&lt;span style="color: teal"&gt;OrderDate&lt;/span&gt;&lt;span style="color: gray"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 10pt"&gt; &lt;span style="color: blue"&gt;FROM&lt;/span&gt; &lt;span style="color: teal"&gt;Sales&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;SalesOrderHeader&lt;/span&gt; &lt;span style="color: teal"&gt;o&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 10pt"&gt; &lt;span style="color: blue"&gt;WHERE&lt;/span&gt; &lt;span style="color: teal"&gt;o&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;ContactID&lt;/span&gt; &lt;span style="color: gray"&gt;=&lt;/span&gt; &lt;span style="color: teal"&gt;c&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;ContactID&lt;/span&gt;&lt;span style="color: gray"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 10pt"&gt; &lt;span style="color: blue"&gt;AS&lt;/span&gt; &lt;span style="color: teal"&gt;OrderDate&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 10pt"&gt;FROM&lt;/span&gt;&lt;span style="font-size: 10pt"&gt; &lt;span style="color: teal"&gt;Person&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;Contact&lt;/span&gt; &lt;span style="color: teal"&gt;c&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;上述查询结果中，OrderDate列会有NULL值。这是由于Sales.SalesOrderHeader 表中没有与Person.Contact 表（外部查询）中的记录相匹配的记录。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;上述查询也可以通过Join联接来实现：&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 10pt"&gt;SELECT&lt;/span&gt;&lt;span style="font-size: 10pt"&gt; &lt;span style="color: teal"&gt;c&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;LastName&lt;/span&gt;&lt;span style="color: gray"&gt;,&lt;/span&gt; &lt;span style="color: teal"&gt;o&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;OrderDate&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 10pt"&gt;FROM&lt;/span&gt;&lt;span style="font-size: 10pt"&gt; &lt;span style="color: teal"&gt;Person&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;Contact&lt;/span&gt; &lt;span style="color: teal"&gt;c&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: gray; font-size: 10pt"&gt;LEFT&lt;/span&gt;&lt;span style="font-size: 10pt"&gt; &lt;span style="color: gray"&gt;JOIN&lt;/span&gt;&lt;span style="color: gray"&gt;(&lt;/span&gt;&lt;span style="color: blue"&gt;SELECT&lt;/span&gt; &lt;span style="color: teal"&gt;ContactID&lt;/span&gt;&lt;span style="color: gray"&gt;,&lt;/span&gt; &lt;span style="color: fuchsia"&gt;MIN&lt;/span&gt;&lt;span style="color: gray"&gt;(&lt;/span&gt;&lt;span style="color: teal"&gt;OrderDate&lt;/span&gt;&lt;span style="color: gray"&gt;)&lt;/span&gt; &lt;span style="color: blue"&gt;AS&lt;/span&gt; &lt;span style="color: teal"&gt;OrderDate&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 10pt"&gt;    &lt;span style="color: blue"&gt;FROM&lt;/span&gt; &lt;span style="color: teal"&gt;Sales&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;SalesOrderHeader&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 10pt"&gt;    &lt;span style="color: blue"&gt;GROUP&lt;/span&gt; &lt;span style="color: blue"&gt;BY&lt;/span&gt; &lt;span style="color: teal"&gt;ContactID&lt;/span&gt; &lt;span style="color: gray"&gt;)&lt;/span&gt; &lt;span style="color: blue"&gt;AS&lt;/span&gt; &lt;span style="color: teal"&gt;o&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="font-size: 10pt"&gt;    &lt;span style="color: blue"&gt;ON&lt;/span&gt; &lt;span style="color: teal"&gt;c&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;ContactID&lt;/span&gt; &lt;span style="color: gray"&gt;=&lt;/span&gt; &lt;span style="color: teal"&gt;o&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;ContactID&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;b&gt;3. &lt;/b&gt;&lt;b&gt;派生表&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;派生表（derived table），有时也称为内联视图，是由查询结果集的列和行组成，与常规的表一样。&lt;/div&gt;
&lt;div&gt;假设要获取订购过某种产品的顾客列表，如Minipump：&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 10pt"&gt;SELECT&lt;/span&gt;&lt;span style="font-size: 10pt"&gt; &lt;span style="color: teal"&gt;c&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;FirstName&lt;/span&gt;&lt;span style="color: gray"&gt;,&lt;/span&gt; &lt;span style="color: teal"&gt;c&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;LastName&lt;/span&gt;&lt;span style="color: gray"&gt;,&lt;/span&gt; &lt;span style="color: teal"&gt;p&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;Name&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 10pt"&gt;FROM&lt;/span&gt;&lt;span style="font-size: 10pt"&gt; &lt;span style="color: teal"&gt;Person&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;Contact&lt;/span&gt; &lt;span style="color: blue"&gt;AS&lt;/span&gt; &lt;span style="color: teal"&gt;c&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: gray; font-size: 10pt"&gt;JOIN&lt;/span&gt;&lt;span style="font-size: 10pt"&gt; &lt;span style="color: teal"&gt;Sales&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;SalesOrderHeader&lt;/span&gt; &lt;span style="color: blue"&gt;AS&lt;/span&gt; &lt;span style="color: teal"&gt;soh&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 10pt"&gt;    &lt;span style="color: blue"&gt;ON&lt;/span&gt; &lt;span style="color: teal"&gt;c&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;ContactID&lt;/span&gt; &lt;span style="color: gray"&gt;=&lt;/span&gt; &lt;span style="color: teal"&gt;soh&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;ContactID&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: gray; font-size: 10pt"&gt;JOIN&lt;/span&gt;&lt;span style="font-size: 10pt"&gt; &lt;span style="color: teal"&gt;Sales&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;SalesOrderDetail&lt;/span&gt; &lt;span style="color: blue"&gt;AS&lt;/span&gt; &lt;span style="color: teal"&gt;sod&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 10pt"&gt;    &lt;span style="color: blue"&gt;ON&lt;/span&gt; &lt;span style="color: teal"&gt;soh&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;SalesOrderID&lt;/span&gt; &lt;span style="color: gray"&gt;=&lt;/span&gt; &lt;span style="color: teal"&gt;sod&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;SalesOrderID&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: gray; font-size: 10pt"&gt;JOIN&lt;/span&gt;&lt;span style="font-size: 10pt"&gt; &lt;span style="color: teal"&gt;Production&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;Product&lt;/span&gt; &lt;span style="color: blue"&gt;AS&lt;/span&gt; &lt;span style="color: teal"&gt;p&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 10pt"&gt;    &lt;span style="color: blue"&gt;ON&lt;/span&gt; &lt;span style="color: teal"&gt;sod&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;ProductID&lt;/span&gt; &lt;span style="color: gray"&gt;=&lt;/span&gt; &lt;span style="color: teal"&gt;p&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;ProductID&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color: blue; font-size: 10pt"&gt;WHERE&lt;/span&gt;&lt;span style="font-size: 10pt"&gt; &lt;span style="color: teal"&gt;p&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;Name&lt;/span&gt; &lt;span style="color: gray"&gt;=&lt;/span&gt; &lt;span style="color: red"&gt;'Minipump'&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;上述查询很容易，但是如果想要获得同时订购过Minipump产品，又订购过 AWC Logo Cap 产品的所有顾客，就有点麻烦了。&lt;/div&gt;
&lt;div&gt;需要把Minipump的订购者和AWC Logo Cap产品的订购者的查询结果联接起来，可以通过派生表来实现。要创建派生表，需要注意如下事项：&lt;/div&gt;
&lt;div&gt;1. 用圆括号包围产生结果集的查询结果；&lt;/div&gt;
&lt;div&gt;2. 给查询的结果赋予别名；&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;下面通过派生表，实现 - 获得同时订购过Minipump产品，又订购过 AWC Logo Cap 产品的所有顾客：&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 10pt"&gt;SELECT&lt;/span&gt;&lt;span style="font-size: 10pt"&gt; &lt;span style="color: teal"&gt;c&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;FirstName&lt;/span&gt;&lt;span style="color: gray"&gt;,&lt;/span&gt; &lt;span style="color: teal"&gt;c&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;LastName&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 10pt"&gt;FROM&lt;/span&gt;&lt;span style="font-size: 10pt"&gt; &lt;span style="color: teal"&gt;Person&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;Contact&lt;/span&gt; &lt;span style="color: blue"&gt;AS&lt;/span&gt; &lt;span style="color: teal"&gt;c&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: gray; font-size: 10pt"&gt;JOIN&lt;/span&gt;&lt;span style="color: gray; font-size: 10pt"&gt;(&lt;/span&gt;&lt;span style="color: blue; font-size: 10pt"&gt;SELECT&lt;/span&gt;&lt;span style="font-size: 10pt"&gt; &lt;span style="color: blue"&gt;DISTINCT&lt;/span&gt; &lt;span style="color: teal"&gt;ContactID&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 10pt"&gt;    &lt;span style="color: blue"&gt;FROM&lt;/span&gt; &lt;span style="color: teal"&gt;Sales&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;SalesOrderHeader&lt;/span&gt; &lt;span style="color: blue"&gt;AS&lt;/span&gt; &lt;span style="color: teal"&gt;soh&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 10pt"&gt;    &lt;span style="color: gray"&gt;JOIN&lt;/span&gt; &lt;span style="color: teal"&gt;Sales&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;SalesOrderDetail&lt;/span&gt; &lt;span style="color: blue"&gt;AS&lt;/span&gt; &lt;span style="color: teal"&gt;sod&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 10pt"&gt;       &lt;span style="color: blue"&gt;ON&lt;/span&gt; &lt;span style="color: teal"&gt;soh&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;SalesOrderID&lt;/span&gt; &lt;span style="color: gray"&gt;=&lt;/span&gt; &lt;span style="color: teal"&gt;sod&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;SalesOrderID&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 10pt"&gt;    &lt;span style="color: gray"&gt;JOIN&lt;/span&gt; &lt;span style="color: teal"&gt;Production&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;Product&lt;/span&gt; &lt;span style="color: blue"&gt;AS&lt;/span&gt; &lt;span style="color: teal"&gt;p&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 10pt"&gt;       &lt;span style="color: blue"&gt;ON&lt;/span&gt; &lt;span style="color: teal"&gt;sod&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;ProductID&lt;/span&gt; &lt;span style="color: gray"&gt;=&lt;/span&gt; &lt;span style="color: teal"&gt;p&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;ProductID&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 10pt"&gt;    &lt;span style="color: blue"&gt;WHERE&lt;/span&gt; &lt;span style="color: teal"&gt;p&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;Name&lt;/span&gt; &lt;span style="color: gray"&gt;=&lt;/span&gt; &lt;span style="color: red"&gt;'Minipump'&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 10pt"&gt;    &lt;span style="color: gray"&gt;)&lt;/span&gt; &lt;span style="color: teal"&gt;pumps&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 10pt"&gt;ON&lt;/span&gt;&lt;span style="font-size: 10pt"&gt; &lt;span style="color: teal"&gt;c&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;ContactID&lt;/span&gt; &lt;span style="color: gray"&gt;=&lt;/span&gt; &lt;span style="color: teal"&gt;pumps&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;ContactID&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: gray; font-size: 10pt"&gt;JOIN&lt;/span&gt;&lt;span style="color: gray; font-size: 10pt"&gt;(&lt;/span&gt;&lt;span style="color: blue; font-size: 10pt"&gt;SELECT&lt;/span&gt;&lt;span style="font-size: 10pt"&gt; &lt;span style="color: blue"&gt;DISTINCT&lt;/span&gt; &lt;span style="color: teal"&gt;ContactID&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 10pt"&gt;    &lt;span style="color: blue"&gt;FROM&lt;/span&gt; &lt;span style="color: teal"&gt;Sales&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;SalesOrderHeader&lt;/span&gt; &lt;span style="color: blue"&gt;AS&lt;/span&gt; &lt;span style="color: teal"&gt;soh&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 10pt"&gt;    &lt;span style="color: gray"&gt;JOIN&lt;/span&gt; &lt;span style="color: teal"&gt;Sales&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;SalesOrderDetail&lt;/span&gt; &lt;span style="color: blue"&gt;AS&lt;/span&gt; &lt;span style="color: teal"&gt;sod&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 10pt"&gt;       &lt;span style="color: blue"&gt;ON&lt;/span&gt; &lt;span style="color: teal"&gt;soh&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;SalesOrderID&lt;/span&gt; &lt;span style="color: gray"&gt;=&lt;/span&gt; &lt;span style="color: teal"&gt;sod&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;SalesOrderID&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 10pt"&gt;    &lt;span style="color: gray"&gt;JOIN&lt;/span&gt; &lt;span style="color: teal"&gt;Production&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;Product&lt;/span&gt; &lt;span style="color: blue"&gt;AS&lt;/span&gt; &lt;span style="color: teal"&gt;p&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 10pt"&gt;       &lt;span style="color: blue"&gt;ON&lt;/span&gt; &lt;span style="color: teal"&gt;sod&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;ProductID&lt;/span&gt; &lt;span style="color: gray"&gt;=&lt;/span&gt; &lt;span style="color: teal"&gt;p&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;ProductID&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 10pt"&gt;    &lt;span style="color: blue"&gt;WHERE&lt;/span&gt; &lt;span style="color: teal"&gt;p&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;Name&lt;/span&gt; &lt;span style="color: gray"&gt;=&lt;/span&gt; &lt;span style="color: red"&gt;'AWC Logo Cap'&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 10pt"&gt;    &lt;span style="color: gray"&gt;)&lt;/span&gt; &lt;span style="color: teal"&gt;caps&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="color: blue; font-size: 10pt"&gt;ON&lt;/span&gt;&lt;span style="font-size: 10pt"&gt; &lt;span style="color: teal"&gt;c&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;ContactID&lt;/span&gt; &lt;span style="color: gray"&gt;=&lt;/span&gt; &lt;span style="color: teal"&gt;caps&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;ContactID&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;但需要注意的是，派生表并不能解决所有的问题。当结果集相当庞大且需要联接大量的记录时，可能要考虑使用临时表，并在其上创建索引（派生表没有索引）。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;b&gt;4. EXISTS &lt;/b&gt;&lt;b&gt;运算符&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;当使用EXISTS 时，并不真正返回数据 – 返回的是关于数据是否存在的TRUE/FALSE，数据满足在EXISTS 语句运行所基于的查询中建立的条件。&lt;/div&gt;
&lt;div&gt; --- 查询应征了该公司另一个职位的雇员列表：&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 10pt"&gt;SELECT&lt;/span&gt;&lt;span style="font-size: 10pt"&gt; &lt;span style="color: teal"&gt;e&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;EmployeeID&lt;/span&gt;&lt;span style="color: gray"&gt;,&lt;/span&gt; &lt;span style="color: teal"&gt;FirstName&lt;/span&gt;&lt;span style="color: gray"&gt;,&lt;/span&gt; &lt;span style="color: teal"&gt;LastName&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 10pt"&gt;FROM&lt;/span&gt;&lt;span style="font-size: 10pt"&gt; &lt;span style="color: teal"&gt;HumanResources&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;Employee&lt;/span&gt; &lt;span style="color: teal"&gt;e&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: gray; font-size: 10pt"&gt;JOIN&lt;/span&gt;&lt;span style="font-size: 10pt"&gt; &lt;span style="color: teal"&gt;Person&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;Contact&lt;/span&gt; &lt;span style="color: teal"&gt;c&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 10pt"&gt;    &lt;span style="color: blue"&gt;ON&lt;/span&gt; &lt;span style="color: teal"&gt;e&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;ContactID&lt;/span&gt; &lt;span style="color: gray"&gt;=&lt;/span&gt; &lt;span style="color: teal"&gt;c&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;ContactID&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 10pt"&gt;WHERE&lt;/span&gt;&lt;span style="font-size: 10pt"&gt; &lt;span style="color: gray"&gt;EXISTS&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="color: blue; font-size: 10pt"&gt;    &lt;/span&gt;&lt;span style="color: gray; font-size: 10pt"&gt;(&lt;/span&gt;&lt;span style="color: blue; font-size: 10pt"&gt;SELECT&lt;/span&gt;&lt;span style="font-size: 10pt"&gt; &lt;span style="color: teal"&gt;EmployeeID&lt;/span&gt; &lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="font-size: 10pt"&gt;    &lt;span style="color: blue"&gt;FROM&lt;/span&gt; &lt;span style="color: teal"&gt;HumanResources&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;JobCandidate&lt;/span&gt; &lt;span style="color: teal"&gt;jc&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="font-size: 10pt"&gt;    &lt;span style="color: blue"&gt;WHERE&lt;/span&gt; &lt;span style="color: teal"&gt;jc&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;EmployeeID&lt;/span&gt; &lt;span style="color: gray"&gt;=&lt;/span&gt; &lt;span style="color: teal"&gt;e&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;EmployeeID&lt;/span&gt;&lt;span style="color: gray"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;使用EXISTS 关键字时，SQL Server 不必在所有的行上进行连接。实际上，SQL Server将浏览记录，直到找到第一个满足条件的记录然后停止于那里。只要有一条记录满足条件，EXISTS 将为真，因此不再需要继续浏览。在进行内部连接时，性能差异将更为显著。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;&lt;img src="http://blog.entlib.com/EntLib/aggbug/190.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>EntLib.com</dc:creator>
            <guid>http://blog.entlib.com/EntLib/archive/2009/04/29/sql-server.aspx</guid>
            <pubDate>Wed, 29 Apr 2009 13:23:45 GMT</pubDate>
            <wfw:comment>http://blog.entlib.com/EntLib/comments/190.aspx</wfw:comment>
            <comments>http://blog.entlib.com/EntLib/archive/2009/04/29/sql-server.aspx#feedback</comments>
            <wfw:commentRss>http://blog.entlib.com/EntLib/comments/commentRss/190.aspx</wfw:commentRss>
        </item>
        <item>
            <title>Enterprise Library for .NET Framework 3.5 (EntLib v4.1) 微软企业库v4.1实验手册发布啦！</title>
            <category>Enterprise Library</category>
            <link>http://blog.entlib.com/EntLib/archive/2009/03/30/enterprise-library-for-.net-framework-3.5-entlib-v4.1-v4.1.aspx</link>
            <description>&lt;div align="center"&gt;&lt;b&gt;Enterprise Library for .NET Framework 3.5 (EntLib v4.1) &lt;/b&gt;&lt;b&gt;微软企业库v4.1&lt;/b&gt;&lt;b&gt;实验手册发布啦！&lt;/b&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;Enterprise Library for .Net Framework 3.5 – EntLib v4.1 是patterns &amp;amp; practices 小组为.NET Framework 3.5 开发一套企业库，目前最新版本为v4.1，共包括9个Application Block，包括数据访问（Data Access Application Block）、异常管理（Exception Handling Application Block）、数据验证（Validation Application Block）等等，对企业应用开发非常有帮助，也非常实用。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;Enterprise Library v4.1 实验手册包括全部9个Application Block，如下图所示。&lt;br /&gt;
 &lt;/div&gt;
&lt;div style="text-align: center"&gt;&lt;img width="509" height="396" alt="" src="/userfiles/EntLib/image/EnterpriseLibrary/EntLib_HandsOnLab_1.gif" /&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;EntLib v4.1 下载地址，包括EntLib v4.1安装包和实验手册：&lt;/div&gt;
&lt;div&gt;&lt;a href="http://entlib.codeplex.com/"&gt;&lt;font color="#0000ff"&gt;http://entlib.codeplex.com&lt;/font&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;希望有兴趣一起翻译的朋友，欢迎和我们联系：&lt;a href="mailto:entlib@hotmail.com"&gt;&lt;font color="#0000ff"&gt;entlib@hotmail.com&lt;/font&gt;&lt;/a&gt;。&lt;br /&gt;
 &lt;/div&gt;
&lt;div&gt;&lt;a href="http://msdn.microsoft.com/practices"&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style="text-align: left"&gt; &lt;img width="322" height="87" alt="" src="/userfiles/EntLib/image/EnterpriseLibrary/pnp_logo.gif" /&gt;&lt;/div&gt;&lt;img src="http://blog.entlib.com/EntLib/aggbug/165.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>EntLib.com</dc:creator>
            <guid>http://blog.entlib.com/EntLib/archive/2009/03/30/enterprise-library-for-.net-framework-3.5-entlib-v4.1-v4.1.aspx</guid>
            <pubDate>Mon, 30 Mar 2009 13:01:45 GMT</pubDate>
            <wfw:comment>http://blog.entlib.com/EntLib/comments/165.aspx</wfw:comment>
            <comments>http://blog.entlib.com/EntLib/archive/2009/03/30/enterprise-library-for-.net-framework-3.5-entlib-v4.1-v4.1.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://blog.entlib.com/EntLib/comments/commentRss/165.aspx</wfw:commentRss>
        </item>
        <item>
            <title>WF 状态机工作流构建订单处理流程-范例程序分析 Part 1</title>
            <category>Workflow (WF)</category>
            <link>http://blog.entlib.com/EntLib/archive/2009/03/23/wf-part-1.aspx</link>
            <description>&lt;div align="center"&gt;&lt;b&gt;WF &lt;/b&gt;&lt;b&gt;状态机工作流构建订单处理流程-&lt;/b&gt;&lt;b&gt;范例程序分析 Part 1&lt;/b&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;状态机工作流（State Machine Workflow）是以状态的变化为驱动而进行业务流转的，且一定需要人为的干预，而不像顺序类型工作流（Sequential Workflow）那样按照事先设计好的业务流程一步一步依次执行下去。本范例程序由&lt;a href="http://forum.entlib.com/"&gt;http://forum.entlib.com&lt;/a&gt; 开源ASP.NET/C# 论坛小组提供。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;State活动有3种类型的状态：起始状态（Initial State）、业务逻辑过程状态、终止状态（Completed State），在一个状态机工作流中起始状态和终止状态只能有一个。状态机工作流是从起始状态开始执行，在运行过程中通过业务逻辑状态的变化来进行工作流的流转，最终由终止状态标志工作流的结束。因此在状态机工作流设计界面上只能添加 State 状态活动，另外，在该状态中还可以添加一个或多个EventDriven 活动。下面通过一个订单处理流程的范例，详细介绍状态机工作流的使用。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;下图简要描述了订单处理流程，你会发现许多地方需要用户参与或输入，来改变工作流。例如，财务部门依赖于支付情况来改变工作流，采购部门依赖于库存情况来改变工作流等等。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div style="text-align: center"&gt;&lt;img height="443" alt="" width="690" src="/userfiles/EntLib/image/WF/WF_OrderWorkflow_1.gif" /&gt; &lt;br /&gt;
 &lt;/div&gt;
&lt;div&gt;按照下面具体的操作步骤，一步一步实现上述状态机工作流演示程序。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;b&gt;1. &lt;/b&gt;&lt;b&gt;创建接口程序&lt;/b&gt;&lt;/div&gt;
&lt;div&gt;由于状态机工作流中大量使用HandleExternalEvent 活动来接收应用程序的操作事件，从而改进该工作流上运行的业务实体的状态，因此需要定义一个接口程序作为工作流和应用程序之间沟通的桥梁。本范例程序中将通过接口中的7个事件来模拟状态机工作流的触发，接口IOrder.cs 如下所示。需要注意的是：我们引用System.Workflow.Activities，并且接口添加了[ExternalDataExchange]属性。&lt;br /&gt;
 &lt;/div&gt;
&lt;div style="text-align: center"&gt;&lt;img height="373" alt="" width="684" src="/userfiles/EntLib/image/WF/WF_OrderWorkflow_2.gif" /&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;2. 创建Class Library项目，并添加State Machine Workflow（状态机工作流）文件。如下图所示。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div style="text-align: center"&gt;&lt;img height="465" alt="" width="690" src="/userfiles/EntLib/image/WF/WF_OrderWorkflow_3.gif" /&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;在添加State Machine Workflow文件后，Workflow设计器自动打开。工作流的每一个State都有事件，因此在State Activity 添加EventDriven组件。&lt;br /&gt;
 &lt;/div&gt;
&lt;div style="text-align: center"&gt;&lt;img height="363" alt="" width="549" src="/userfiles/EntLib/image/WF/WF_OrderWorkflow_4.gif" /&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;在事件Event触发后，State状态进入下一个状态。因此，双击EventDriven组件，添加HandleExternalEvent组件和SetState组件，其中HandleExternalEvent定义监听的事件，SetState定义将进入的下一个状态。&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div style="text-align: center"&gt;&lt;img height="445" alt="" width="690" src="/userfiles/EntLib/image/WF/WF_OrderWorkflow_5.gif" /&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;img height="431" alt="" width="690" src="/userfiles/EntLib/image/WF/WF_OrderWorkflow_6.gif" /&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;按照上面的步骤，重复创建OrderPlaced、OrderApproved、OrderPending、OrderDelivered、OrderCancelled状态，并添加相应的EventDriven组件，最终实现的状态机工作流如下所示：&lt;/div&gt;
&lt;div style="text-align: center"&gt;  &lt;img height="474" alt="" width="680" src="/userfiles/EntLib/image/WF/WF_OrderWorkflow_7.gif" /&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;&lt;img src="http://blog.entlib.com/EntLib/aggbug/157.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>EntLib.com</dc:creator>
            <guid>http://blog.entlib.com/EntLib/archive/2009/03/23/wf-part-1.aspx</guid>
            <pubDate>Sun, 22 Mar 2009 17:32:29 GMT</pubDate>
            <wfw:comment>http://blog.entlib.com/EntLib/comments/157.aspx</wfw:comment>
            <comments>http://blog.entlib.com/EntLib/archive/2009/03/23/wf-part-1.aspx#feedback</comments>
            <slash:comments>6</slash:comments>
            <wfw:commentRss>http://blog.entlib.com/EntLib/comments/commentRss/157.aspx</wfw:commentRss>
        </item>
    </channel>
</rss>