VS2008 技术快讯:LINQ to XSD 和 LINQ to Stored XML

  • Hartmut Wilms
  • 张海龙

2007 年 12 月 9 日

话题:.NET语言 & 开发

微软可编程数据团队的主发开发领导——Shyam PatherXML 2007 大会上进行了一个主题为LINQ to XML:Visual Studio 2008、Silverlight 和 Beyond的演讲,另外,他还谈到有关 LINQ to XML 现在和未来和一些技术话题。

演讲的前两个部分讲述了 LINQ to XML 的基础和当前的高级 XML 特性:

  • LINQ to XML 相关类,如 XDocument、XElement、XAttribute、XNamespace、XName
  • VB XML Literals
  • 智能感知支持
  • 有效的运算符重载
    • 通过对 XElement 和 XAttribute 进行转型操作,可绕过.Value 属性对内容进行操作
    • 可置空类型和空合并运算符
  • 桥接类,可以通过 System.Xml API 访问 LINQ to XML 树

演讲的幻灯片可以通过会议的网站下载。

在演讲的第三部分中,Shyam 展示了未来 LINQ to XML 的一些扩展:LINQ to XSD 和 LINQ to Stored XML。

LINQ to XSD 最早是由微软 XML 团队在 2006 年 11 月发布,其中包括一个为 2006 年 5 月 LINQ 的 CTP 发布的 Alpha 0.1 预览版:

LINQ to XSD 为.NET 开发者提供了基于 LINQ to XML 的类型化 XML 编程的支持。程序员使用 LINQ to XML 对一般的 XML 树进行操作,而 LINQ to XSD 则被用来对类型化 XML 树进行操作,这些 XML 树是一些将特定的 XML schema(XSD)类型模式化为.NET XML 类型后的实例。为了帮助理解,请思考一下下面的 C# 3.0 程序片段,它用 LINQ to XML 查询 XML 树中所有项目的总数以生成购买订单:

(from item in purchaseOrder.Elements("Item")

select (double)item.Element("Price") * (int)item.Element("Quantity")

).Sum();

使用 LINQ to XSD,这一查询可以以更加简洁和类型安全的方式来实现:

(from item in purchaseOrder.Item

select item.Price * item.Quantity

).Sum();

2007 年 7 月,针对 Visual Studio 2008 Beta 1 的另一个 Alpha 0.2 预览版发布,但在 VS 2008 Beta2 中没有出现 LINQ to XSD 预览版,这可能是因为该技术的带头人Ralf Lämmel博士离开了微软。OakLeaf Systems 的首席咨询师Roger Jennings了解LINQ to XSD 的详细历史,他提及此事并要求微软提供相应的升级。

Ralf Lämmel 更新了他的 LINQ to XSD 实现,在 2006 年 11 月为 2006 年 5 月 LINQ CTP 版提供的 Alpah 0.1 预览版,和为 2007 年 6 月 5 号的 Orcas Beta 1 中提供的 Alpha 0.2 预览版中可以进行增强类型化 LINQ to XML 查询,之后 Lämmel 博士就返回了德国,在科布伦次大学(University of Koblenz)的计算机科学系担任全职教授。对于 VS 2008 最终版中的 LINQ to XSD 更新,负责 LINQ to XML 的微软 XML 团队还没有正式表态,希望最终不会因为人员变化导致这个非常有用的 LINQ 消失。

LINQ to Stored XML(数据库中的 XML 形式)在 SQL Server 2005 中提供了多种针对 XML 数据类型列的查询方式,目标是通过提供“从 XML schema 到类的映射”和“从 LINQ 表达式到服务器 XQuery 表达式的查询转换”来实践“提供增强类型化 LINQ 体验,胜过 XML 数据类型列中的数据”的理念,下面的查询示例是在一个将‘Resume’作为一个 XML 数据类型列的 AdventureWorks 数据库中进行的:

查询:

var q = from o in _data.JobCandidates

           where o.Resume.Skills.Contains("production")

           select o.Resume.Name.Name_Last;

输出: 

SELECT [Extent1].[Resume].query(

           N'declare namespace r="http://.../adventure-works/Resume";

           /*[1]/r:Name/r:Name.Last'


           ).value(N'.', N'nvarchar(max)') AS [C1]

FROM  [HumanResources].[JobCandidate] AS [Extent1]

WHERE cast(1 as bit) = ([Extent1].[Resume].query(

           N'declare namespace r="http://.../adventure-works/Resume";

           contains(/*[1]/r:Skills, "production")'


           ).value(N'.', N'bit'))

这次演讲是第一个证明 LINQ to XSD 还在继续发展、LINQ to Stored XML 也正在进行中的迹像,但可惜不知道发布日期,甚至连何时能提供预览也都没有提及。

查看英文原文Post-VS 2008-Technology: LINQ to XSD and LINQ to Stored XML
.NET语言 & 开发