技术开发 频道

LINQ to XSD和LINQ to Stored XML

   微软可编程数据团队的主发开发领导——Shyam Pather在XML 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也正在进行中的迹像,但可惜不知道发布日期,甚至连何时能提供预览也都没有提及。

0
相关文章