学习LINQ时,经常会遇到LINQ语法问题,这里将介绍LINQ语法问题的解决方法,以及介绍LINQ 是一系列语言延伸模块,以型别安全的方式支持数据查询。
程序语言随着时间演进,一再沉淀经验与抽象后,以简练直观的语法解决具有共通特征的各式问题。Visual Studio 2008(程序代码名称为 Orcas)、C# 3.0 与 VB.NET 9.0 后将支持新的语法 Language Integrated Query(LINQ),想一体解决多样的资料存取。它是由 Anders Hejlsberg 所主导。Anders 曾打造了 Turbo Pascal、Delphi、Visual J++、C# 等叫好叫座的产品,单凭这位杀手应用创造者的眼光,LINQ 就不可小觑。
LINQ 是一系列语言延伸模块,以型别安全的方式支持数据查询。期待隔绝各种数据的特性,不管是各厂家数据库的 SQL 方言,或是 XML 的 DOM、XQuery 或 XPath,抑或是对象集合的属性存取。以共通的方式完成数据操作,如:挑选、比对、排序、汇总…等等。期待减轻程序开发人员学习操作各种数据的负荷。
LINQ 藉由各语言编译程序将内嵌的 LINQ语法转译成原本的 C# 或 VB.NET 程序代码,并呼叫相关的底层模块以实体维护数据。***编译成与 .NET Framework 2.0 CLR 兼容的 IL,所以 CLR 本身并未增加与 LINQ 相关的模块,但 .NET Framework、Visual Studio 整合开发环境和程序语言需要增加相关功能和语法。
就笔者自己的感觉,LINQ 有以下的好处:
◆简化大量的细节运作,将如何(how)取得数据换成要操作什么(what)数据:这隐含存取优化交由专家来做,如 DB 引擎优化存取数据。
◆透过IEnumerable<T> 一致性地存取各种数据,并在查询语法中互相整合:如 File System、操作系统的 process、Registry、对象集合、XML、DB...,所用的皆是对象,大家的属性都是数据。换句话说,数据对象化,对象数据化,存取二者的语法与语意相同。
◆平行运算:若要处理大量数据,程序设计师不容易撰写 for 循环还包含平行运算。但 LINQ 转译成 C# 或 VB.NET 的程序代码时,可以平行运算的方式处理大量数据。
◆撰写数据对象存取的过程中,可以 IntelliSense 和强型别检查:相较于以往 ADO.NET 加上 SQL 语法,LINQ 比 typed dataset 直观易懂,且应用更为广泛。
就笔者与许多朋友聊到 LINQ 时,最多的询问便是「未来是否不需要学 SQL 了?」个人认为,短时间不可能,LINQ 或许会减轻程序设计师对 SQL 的倚赖,但 LINQ 不会取代 SQL。它们各有一片天,LINQ 是程序设计师讲的数据对象语言,SQL 是数据库管理师对数据库引擎讲的语言,LINQ 是从应用程序处理数据的角度出发,但 SQL 关乎着整体数据库服务器有效且安全地活着的每一个细节。
而紧接的问题通常是:「将数据以对象来包装,透过 entity 类别间接存取数据,那是否会有效率问题?」这笔者无法回答,尚待真实世界来证明。
LINQ 范例
你可以在 C# 中直接内嵌如下的语法:取得在 Customer 对象集合中,每个 Customer 的属性 Country 值为 USA,按照 City 属性由大到小排序,传回以 CompanyName 和 City 两个属性的字符串值所建立的新对象之集合:
- var matchCustomers = from c in db.Customers
- where c.Country == "USA"
- orderby c.City descending
- select new { c.CompanyName, c.City };
这句 LINQ语法经由 C# 编译程序解析,传回实做 IEnumerable<Anonymous Type> 接口的对象给 matchCustomers 变量。而在查询语法中,呼叫了 where、orderby、select 等延伸方法(Extension Methods)。并定义匿名方法(Anonymous Methods)的委派(delegate);要求 where 方法比较 Customers 集合中 Customer 对象的 Country 属性值为 USA。换句话说,自动将 c.Country == "USA" 转成 bool Pred<T>(T item) 形式的委派。***透过 select 延伸方法搭配对象初始化表达式,回传匿名型别(Anonymous Type)对象的集合。
若不采用 LINQ 写法,上述语法也可以写成如下的方式:
- var matchCustomers = db.Customers.Where(c => c.Country == "USA").
OrderByDescending(c => c.City).Select(c => new { c.CompanyName, c.City });
哇,想我修习 .NET 数年,竟不知所云!?在此介绍一本入门书:「Introducing Microsoft LINQ」,Microsoft Press 出版。它让你了解以往的 C# 和 VB.NET 各版本如何渐进地增加功能,***演变出 LINQ语法。
【编辑推荐】