这些都是在SQL语句中经常用到的,因此从形式上看,LINQ 语句与 SQL有很多相似之处。但尽管如此,还应该明确,LINQ与SQL是两种完全不同性质的语言:
第一、 LINQ是面向对象的强类型(类型安全)语言;
第二、 从理论上讲,LINQ几乎可以用来访问所有类型的数据(包括数据库)。 7.3.2 语句示例
例1.下面是LINQ的一个表达式:
var course =
from w in "语文 数学 英文 物理 计算机 伦理学 新闻学".Split() where w.Length >2
orderby w.ToUpper() descending // 按降序排列 select w;
从表面上看,它像一组SQL语句,但它不是SQL。下面分别说明他们之间的区别: 1.在SQL语句中总是将Select放在最前面,而这里将from改放在最前面,在from与Select之间允许放入where、joins、orderby 或intos等子句。
为什么顺序上要做这样的改变?这是因为只有先用from确定了应用范围,在后面的语句中才能更好地利用“智能提示”来选择字段等项。
另外,在LINQ中,语句以及变量是区分大、小写的(在SQL语句不区分大小写)。 2.等号前面的“var course”形式,在JavaScript语言中经常可以看见,但它的含义与JavaScript也有所不同。这里的course是一个隐式类型的局部变量,它实际上是一个强类型变量,虽然没有明确定义,但它的类型由等号右边的语句来确定。编译时系统已经赋予它类型。
用这种方式来定义变量类型有什么好处呢?不妨设想一下,如果等号的右边是一组查询语句(后面将讲到),而查询的结果可能是一个包括多个属性的复杂对象。为了获取结果,现在已经用不着花时间去定义它的类型了,定义它的工作完全由编译器来自动确定。
3.语句中的w(也可以使用其他符号,如:p、m、n等)在传统的语句中比较少见,它是一个范围变量,在from、let、join或into中用来表示某个范围。这个变量的类型虽然没有直接定义,但是它的类型也由编译器确定。
4.w是一个局部变量,它的有效范围只限于本表达式的内部。表达式总是用select或groupby子句来结束。
例2.再看一个LINQ 程序: void Main() {
string[] words =
{ "hello", "wonderful", "linq", "beautiful", "world" }; var shortWords =
已修订
from word in words where word.Length <= 5 select word;
foreach (var word in shortWords) Console.WriteLine(word); }
[注]: LINQPad 是一个很好的学习LINQ工具.可以免费下载,网址是:http://www.linqpad.net 需下载两个文件:
Download LINQPad.exe Download Setup.exe
Lambda 表达式(Expression)
Lambda Expression相当于嵌入到语句中的匿名函数,它非常简短,却可以包含丰富的内涵。Lambda Expression的格式如下:“ (参数列表) => 表达式或者语句块 其中:
在参数列表中可以包括0到多个参数。参数的类型可以隐含也可以直接显示。隐含时属于什么类型,则由编译器根据前后文自动确定。
表达式或者语句块就是我们平常写的函数的实现部分(函数体)。 几个典型的Lambda 表达式如下: 1.隐含类型的输入参数
x => x + 1 // 一个参数 x => { return x + 1; } customer => customer.Name person => person.City == "Paris" (x, y) => x * y // 多个参数
(person, minAge) => person.Age >= minAge
已修订
2.显示类型的输入参数
(int x) => x + 1
(int x) => { return x + 1; }
3.无输入参数
( ) => 1
( ) => Console.WriteLine()
显示类型的表达式也可以简化为隐含类型的表达式。如 (int x, int y) => x*y 可以简化为: ( x, y ) => x * y
其中“=>”念成“goes to”,它的左边代表输入参数;右边为表达式。编译后的结果如下:
int f (int x, int y) {
return x * y }
下面写一段程序来执行上述代码: static void Main() {
Func<int, int, int> add =(int x, int y) => x * y; Console.WriteLine(add(6, 4)); Console.ReadLine();
原文:http://www.cnblogs.com/spursy/p/3946011.html