LINQ语法学习经验

开发 后端
这里介绍LINQ语法经由 C# 编译程序解析,传回实做 IEnumerable<Anonymous Type> 接口的对象给 matchCustomers 变量。而在查询语法中,呼叫了 where、orderby、select 等延伸方法(Extension Methods)。

学习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 两个属性的字符串值所建立的新对象之集合:

  1. var matchCustomers = from c in db.Customers  
  2. where c.Country == "USA"  
  3. orderby c.City descending  
  4. 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 写法,上述语法也可以写成如下的方式:

  1. 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语法。

【编辑推荐】

  1. LINQ to SQL Table浅谈
  2. Linq语句问题的解决方法
  3. Ling to sql更新实体概述
  4. Linq实体继承简单描述
  5. Linq Library概述
责任编辑:佚名 来源: 博客园
相关推荐

2015-07-07 10:43:59

Swift语法基础

2015-07-07 10:58:29

Swift语法高级

2010-05-27 17:56:39

MySQL存储过程

2011-08-18 15:19:28

XcodeObjective-C语法

2011-08-05 14:16:47

Objective-C 变量 方法

2009-09-10 17:38:04

LINQ技术

2009-09-11 12:08:09

Linq to SQL

2009-09-08 15:27:08

Linq Select

2009-09-07 17:09:45

Linq To Sql

2009-09-16 17:13:54

学习Linq

2009-08-31 16:51:11

C# Main()方法

2009-08-27 09:27:49

C#扩展方法

2009-09-17 08:47:00

Linq查询

2009-08-18 12:52:33

C#枚举类型

2009-09-09 16:53:53

LINQ查询语法

2009-09-14 09:55:55

Linq基本语法

2009-09-14 10:20:52

LINQ查询语法

2009-09-11 13:29:31

LINQ查询操作

2009-09-16 17:44:54

LINQ to SQL

2009-09-08 10:57:55

LINQ查询操作
点赞
收藏

51CTO技术栈公众号