LINQ to XSD和LINQ to Stored XML
微软可编程数据团队的主发开发领导——Shyam Pather在XML 2007大会上进行了一个主题为LINQ to XML:Visual Studio 2008、Silverlight和Beyond的演讲,另外,他还谈到有关LINQ to XML现在和未来和一些技术话题。¦Í§QÕÿ}áforum.entlib.net.cn'Úªòæn:Þ
¦Í§QÕÿ}áforum.entlib.net.cn'Úªòæn:Þ
演讲的前两个部分讲述了LINQ to XML的基础和当前的高级XML特性:¦Í§QÕÿ}áforum.entlib.net.cn'Úªòæn:Þ
¦Í§QÕÿ}áforum.entlib.net.cn'Úªòæn:Þ
* LINQ to XML相关类,如XDocument、XElement、XAttribute、XNamespace、XName¦Í§QÕÿ}áforum.entlib.net.cn'Úªòæn:Þ
* VB XML Literals¦Í§QÕÿ}áforum.entlib.net.cn'Úªòæn:Þ
* 智能感知支持¦Í§QÕÿ}áforum.entlib.net.cn'Úªòæn:Þ
* 有效的运算符重载¦Í§QÕÿ}áforum.entlib.net.cn'Úªòæn:Þ
o 通过对XElement和XAttribute进行转型操作,可绕过.Value属性对内容进行操作¦Í§QÕÿ}áforum.entlib.net.cn'Úªòæn:Þ
o 可置空类型和空合并运算符¦Í§QÕÿ}áforum.entlib.net.cn'Úªòæn:Þ
* 桥接类,可以通过System.Xml API访问LINQ to XML树¦Í§QÕÿ}áforum.entlib.net.cn'Úªòæn:Þ
¦Í§QÕÿ}áforum.entlib.net.cn'Úªòæn:Þ
演讲的幻灯片可以通过会议的网站下载。¦Í§QÕÿ}áforum.entlib.net.cn'Úªòæn:Þ
¦Í§QÕÿ}áforum.entlib.net.cn'Úªòæn:Þ
在演讲的第三部分中,Shyam展示了未来LINQ to XML的一些扩展:LINQ to XSD和LINQ to Stored XML。¦Í§QÕÿ}áforum.entlib.net.cn'Úªòæn:Þ
¦Í§QÕÿ}áforum.entlib.net.cn'Úªòæn:Þ
LINQ to XSD最早是由微软XML团队在2006年11月发布,其中包括一个为2006年5月LINQ的CTP发布的Alpha 0.1预览版:¦Í§QÕÿ}áforum.entlib.net.cn'Úªòæn:Þ
¦Í§QÕÿ}áforum.entlib.net.cn'Úªòæn:Þ
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树中所有项目的总数以生成购买订单:¦Í§QÕÿ}áforum.entlib.net.cn'Úªòæn:Þ
¦Í§QÕÿ}áforum.entlib.net.cn'Úªòæn:Þ
(from item in purchaseOrder.Elements("Item")¦Í§QÕÿ}áforum.entlib.net.cn'Úªòæn:Þ
select (double)item.Element("Price") * (int)item.Element("Quantity")¦Í§QÕÿ}áforum.entlib.net.cn'Úªòæn:Þ
).Sum();¦Í§QÕÿ}áforum.entlib.net.cn'Úªòæn:Þ
¦Í§QÕÿ}áforum.entlib.net.cn'Úªòæn:Þ
使用LINQ to XSD,这一查询可以以更加简洁和类型安全的方式来实现:¦Í§QÕÿ}áforum.entlib.net.cn'Úªòæn:Þ
(from item in purchaseOrder.Item¦Í§QÕÿ}áforum.entlib.net.cn'Úªòæn:Þ
select item.Price * item.Quantity¦Í§QÕÿ}áforum.entlib.net.cn'Úªòæn:Þ
).Sum();¦Í§QÕÿ}áforum.entlib.net.cn'Úªòæn:Þ
¦Í§QÕÿ}áforum.entlib.net.cn'Úªòæn:Þ
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的详细历史,他提及此事并要求微软提供相应的升级。¦Í§QÕÿ}áforum.entlib.net.cn'Úªòæn:Þ
¦Í§QÕÿ}áforum.entlib.net.cn'Úªòæn:Þ
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消失。¦Í§QÕÿ}áforum.entlib.net.cn'Úªòæn:Þ
¦Í§QÕÿ}áforum.entlib.net.cn'Úªòæn:Þ
LINQ to Stored XML(数据库中的XML形式)在SQL Server 2005中提供了多种针对XML数据类型列的查询方式,目标是通过提供“从XML schema到类的映射”和“从LINQ表达式到服务器XQuery表达式的查询转换”来实践“提供增强类型化LINQ体验,胜过XML数据类型列中的数据”的理念,下面的查询示例是在一个将‘Resume’作为一个XML数据类型列的AdventureWorks数据库中进行的:¦Í§QÕÿ}áforum.entlib.net.cn'Úªòæn:Þ
¦Í§QÕÿ}áforum.entlib.net.cn'Úªòæn:Þ
查询:¦Í§QÕÿ}áforum.entlib.net.cn'Úªòæn:Þ
¦Í§QÕÿ}áforum.entlib.net.cn'Úªòæn:Þ
var q = from o in _data.JobCandidates¦Í§QÕÿ}áforum.entlib.net.cn'Úªòæn:Þ
¦Í§QÕÿ}áforum.entlib.net.cn'Úªòæn:Þ
where o.Resume.Skills.Contains("production")¦Í§QÕÿ}áforum.entlib.net.cn'Úªòæn:Þ
¦Í§QÕÿ}áforum.entlib.net.cn'Úªòæn:Þ
select o.Resume.Name.Name_Last;¦Í§QÕÿ}áforum.entlib.net.cn'Úªòæn:Þ
¦Í§QÕÿ}áforum.entlib.net.cn'Úªòæn:Þ
输出: ¦Í§QÕÿ}áforum.entlib.net.cn'Úªòæn:Þ
¦Í§QÕÿ}áforum.entlib.net.cn'Úªòæn:Þ
SELECT [Extent1].[Resume].query(¦Í§QÕÿ}áforum.entlib.net.cn'Úªòæn:Þ
N'declare namespace r="http://.../adventure-works/Resume";¦Í§QÕÿ}áforum.entlib.net.cn'Úªòæn:Þ
/*[1]/r:Name/r:Name.Last'¦Í§QÕÿ}áforum.entlib.net.cn'Úªòæn:Þ
).value(N'.', N'nvarchar(max)') AS [C1]¦Í§QÕÿ}áforum.entlib.net.cn'Úªòæn:Þ
¦Í§QÕÿ}áforum.entlib.net.cn'Úªòæn:Þ
FROM [HumanResources].[JobCandidate] AS [Extent1]¦Í§QÕÿ}áforum.entlib.net.cn'Úªòæn:Þ
¦Í§QÕÿ}áforum.entlib.net.cn'Úªòæn:Þ
WHERE cast(1 as bit) = ([Extent1].[Resume].query(¦Í§QÕÿ}áforum.entlib.net.cn'Úªòæn:Þ
N'declare namespace r="http://.../adventure-works/Resume";¦Í§QÕÿ}áforum.entlib.net.cn'Úªòæn:Þ
contains(/*[1]/r:Skills, "production")'¦Í§QÕÿ}áforum.entlib.net.cn'Úªòæn:Þ
).value(N'.', N'bit'))¦Í§QÕÿ}áforum.entlib.net.cn'Úªòæn:Þ
¦Í§QÕÿ}áforum.entlib.net.cn'Úªòæn:Þ
这次演讲是第一个证明LINQ to XSD还在继续发展、LINQ to Stored XML也正在进行中的迹像,但可惜不知道发布日期,甚至连何时能提供预览也都没有提及。¦Í§QÕÿ}áforum.entlib.net.cn'Úªòæn:Þ