Linq刚接触的时候总感觉挺神秘的,后来断断续续的也用过到一些linq的基本查询,只是一直没有系统的学习。
接下来的博客只当从头对linq来一个全面的学习(本系统博客注重的主要是实用型,可能更多的是Lambda查询表达的一些用法),下面开始第一篇
一、认识Linq
LINQ:语言集成查询(Language Integrated Query),是一系列标准查询操作符的集合,这些操作符几乎对每一种数据源的导航,过滤和执行都是提供了底层的基本查询架构。这是LINQ的官方解释。简单点说就是对一个数据集进行重新筛选。
LINQ操作对象:关系数据、XML、DataSet、或内存中的数据。
LINQ出现的背景:大多数开发人员对OO(面向对象编程)的熟悉,最好提把对数据的操作转化成对对象的操作。而LINQ恰好将标准查询功能直接整合到了供开发人员选择的基于.NET的编程语言中。
LINQ技术的重点是查询表达式,因为它描述了对数据源的具体操作
认识LINQ不得不先说两个接口
IEnumerable <T> 泛型接口
公开枚举数,该枚举数支持在指定类型的集合上进行简单迭代。
public class MyCollections<T> : IEnumerable<T> { T[] values = new T[100]; public IEnumerator<T> GetEnumerator() { for (int i = 0; i < 100; i++) { yield return values[i]; } } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } } class Class2 { static void Main() { MyCollections<int> Mycol = new MyCollections<int>(); foreach (int i in Mycol) { Console.WriteLine(i); } } }
Iqueryable<T>提供对数据类型已知的特定数据源的查询进行计算的功能。
此接口继承 IEnumerable<T>接口,因此,如果它表示一个查询,则可以枚举该查询的结果。枚举强制执行与 Iqueryable<T>对象关联的表达式目录树。
二、LINQ查询表达式基本概念
//获取数据源 string[] Devices= {"电视" ,"电冰箱","洗衣机","电话","微波炉"}; //创建查询 var SelectDevices = from device in Devices where device.StartsWith("电") select device; //执行查询 foreach (string dev in SelectDevices) { Console.WriteLine("带电的设备:{0}",dev); }
四、匿名方法
在 2.0 之前的 C# 版本中,声明委托的唯一方法是使用命名方法。C# 2.0 引入了匿名方法,而在 C# 3.0 及更高版本中,Lambda 表达式取代了匿名方法,作为编写内联代码的首选方式。不过,本主题中有关匿名方法的信息同样也适用于 Lambda 表达式。
有一种情况下,匿名方法提供了 Lambda 表达式中所没有的功能。匿名方法使您能够省略参数列表(就是delegate后面什么都没有),这意味着可以将匿名方法转换为带有各种签名的委托。这对于 Lambda 表达式来说是不可能的。
delegate void Del(int i); Del d = delegate { MessageBox.Show(“aaaaaa”); }; //正确 d(1); Del d1 =n=> { MessageBox.Show(“sssss”); };//固定对应 d1(2);
五、Lambda表达式
到这里真正到了本次博客的重点了,因为本人更喜欢用方法语法的缘故吧!呵呵
下面先认识一下Lambda表达式吧
static void Main() { del myDelegate = x => x * x; int j = myDelegate(5); //j = 25 Console.WriteLine(j); } delegate int del(int i);
3、只有在 Lambda 有一个输入参数时,括号才是可选的;否则括号是必需的。无参也需要括号,两个或更多输入参数由括在括号中的逗号分隔:
(x, y) => x == y
4、在编写 Lambda 时,通常不必为输入参数指定类型,因为编译器可以基于 Lambda 主体、基础委托类型以及 C# 3.0 语言规范中描述的其他因素推断类型。对于大多数标准查询运算符,第一个输入是源序列中的元素的类型。因此,如果要查询 IEnumerable<Customer>,则输入变量将被推断为 Customer类型,这意味着您可以访问其方法和属性:
customers.Where(c => c.City == "London");
说这么多了,总感觉不舒服,还是直接来个例子实在啊!
string[] Devices= {"电视" ,"电冰箱","洗衣机","电话","微波炉"};
方法语法表示:
var SelectDevices =Devices .Where ( device => device.StartsWith("电")) foreach (string dev in SelectDevices) { Console.WriteLine("带电的设备:{0}",dev); }
好了,到这里已经对linq有了一个基本的认识了啊!别着急,慢慢来!今天就到这里吧,要上班了!