C#-Linq的相关背景

初识Linq


LINQ: Language-INtegrated Query。

LINQ带来的最大的优势在于让开发人员极大地提高了效率,因为只用一种统一的方法即可在相应语言中对各种数据进行查询和更新。目前LINQ主要包含LINQ to Objects,LINQ to XML,LINQ to SQL, LINQ to Entity,其中objects代表内存集合,Entity代表ADO.NET Entity Framework(微软的ORM框架)。

以LINQ to Object为例,说明其语法的简洁和可读性。

场景,超找操作系统中内存占用率超过200M的进程。

传统方法:

 

//创建一个方法,以便创建Compare<T>的委托,作为List<T>的Sort方法
static
int CompareProcess(Process @this, Process other) { return @this.WorkingSet64.CompareTo(other.WorkingSet64); } static void Main(string[] args) { List<Process> result = new List<Process>(); foreach (Process process in Process.GetProcesses()) { if (process.WorkingSet64 > 200 * 1024 * 1024) { result.Add(process); } } result.Sort(CompareProcess); Console.ReadKey(); }

LINQ的做法:

var result = Process.GetProcesses().Where(p => p.WorkingSet64 > 200 * 1024 * 1024);

 在这个简单的LINQ的写法中包含了很多因为LINQ而引入的语言扩展:

  1. 隐式类型局部变量。var result
  2. Lambda表达式。p => p.WorkingSet64 > 200 * 1024 * 1024
  3. 扩展方法。Where<>

对于上述场景,如果我只想找到大于200M的进程,然后只获取该进程的Name和ID,LINQ的写法如下:

var result = Process.GetProcesses()
                .Where(p => p.WorkingSet64 > 200 * 1024 * 1024)
                .Select(p => new { Name = p.ProcessName, Id = p.Id });

  4. 匿名类型。Select(p => new { Name = p.ProcessName, Id = p.Id })。这个匿名类型类似于Python中的元组,不可变对象。

 

Lambda表达式


在委托的上下文中,Lambda表达式可以隐式转换为委托。

在LINQ的上下文中,Lambda表达式可以隐式的转换为Expression<TDelegate>,此时Lambda表达式作为数据,LINQ在内部将其转化为表达式树,以便LINQ Provider根据表达树生成相应的代码对数据源查询,这也是LINQ to SQL, LINQ to Entity的原理。

Lambda表达式分为两种:

  1. 表达式Lambda, Expression Lambda。比如  i => i > 2 。此类Lambda可以转换成表达式树
  2. 语句Lambda, Statement Lambda。比如 i => {return i > 2}。 此类Lambda不可以转换成表达式树

 

posted @ 2017-02-19 20:51  june.js  阅读(174)  评论(0)    收藏  举报