29 November 2014

声明式语言

LINQ 语言集成查询{Language Integrated Query},有 LINQ to XML、LINQ to Object、LINQ to SQL。SQL 结构化查询语言{Structured Query Language},主要用于 RDBMS。它们都是声明式语言,即专注于 how to do 而不是 what to do ,大大提升了代码的可读性和生产力。

投影

LINQfrom 开始:

from f in fruit select f.Name

SQLselect 开始:

select name from fruit

LINQ 和 SQL 都是用 select 投影出最终的结果。LINQ 之所以以 from 开始是因为查询表达式最终会依次转化为方法的调用,上面就可以转化为 fruit.Select(name => name),因此书写顺序即执行顺序;而 SQL 的书写顺序是以 select 开始,但执行顺序却是以 from 开始,因此 SQL 的书写顺序与执行顺序不同。LINQ 的这个特性同时还会提供智能感知,通过数据源推断出 name 的类型后,后续的表达式就可以得知 name 的具体类型,从而调用其本身的方法。

筛选

LINQ:

from f in fruit where f.Name == "apple" select f

SQL:

select * from fruit where name = 'apple'

LINQ 和 SQL 都是使用 where 筛选满足条件的项/记录。

排序

升序

LINQ:

from f in fruit orderby f.Name select f 

SQL:

select * from fruit order by name

降序

LINQ:

from f in fruit orderby f.Name descending select f 

SQL:

select * from fruit order by name desc

分组

LINQ:

from f in fruit group f by f.Price

SQL:

select price from fruit group by price

需要注意的是,LINQ 中的查询表达式以 group by 或者 select 结尾,如果需要执行后续操作,需使用 into xxx。SQL 中的 select 中的列只能是 group by 中出现过的,这是由于 SQL 执行顺序所决定的,select 在 group by 之后执行,所以只能看到 group by 后的结果。与 SQL 相同,使用 into 的 LINQ 后续查询操作也只能看到 xxx 变量。

内联操作

LINQ:

from s in student
join c in course on s.courseid equals c.id
select new { Name = s.Name, Course = c.Name }

SQL:

select * from student join course on student.courseid = course.id

左外连接

LINQ:

from s in student
join c in course on s.courseid equals c.id
into selectCourse
select new { Name = s.Name, Count = selectCourse.Count() }

SQL:

select * from student left join course on student.courseid = course.id

LINQ 中的没有提供 SQL 中的 right join,可以调整左右两边序列位置来实现右外连接。

笛卡儿积

LINQ:

from s in student
from c in course
select new { Name = s.Name, Course = c.Name }

SQL:

select * from student, course

补充

当使用 LINQ 时,如过两个序列进行组合操作,会先缓存右边序列,然后遍历左边序列,所以,应当考虑把大的序列放在左边遍历,小的序列放在右边缓存。