Linq是插入C#和VB.net中的一种SQL查询语言。SQL查询语言是一个以用途目的为导向,而不是指令式的语言,因此比较人性化。

结合Linq,C#也能写出高效易于理解的数据处理代码。因此,每一个学习c#的朋友,都应该学好Linq。

下面是我学习的一些总结,希望对大家也有点帮助。

函数形式和查询语句形式

Linq语言包含两种形式,一种是Linq的特有查询语言,一种是函数形式的。函数形式是补充的功能,而特有形式是一般常用的功能。所有的特有形式,都有对应的函数形式,Linq的特有查询形式,实际上是一种语法糖。

立即执行和延迟执行

Linq有两种执行模式,一种是立即执行,一种是延迟执行。延迟执行本质上相当于匿名函数,你写了一个匿名函数的函数体,不代表你会立刻调用,只有当你调用的时候,才会执行。

流式和非流式

Linq中,对数据处理采用了两种模式,一种是一个接一个元素进行单独处理,这称为流式,一个是整体处理,这叫非流式。Linq为了优化性能,采用了要多少数据就实际读取多少数据的策略,应该还是比较好理解的。

Linq标准查询函数分类列表

聚合操作

  • Aggregate(Func<聚合值, 下一个元素, 返回聚合值>) 根据特定函数执行聚合操作(聚合就是累计吧)
  • Average 序列的平均值。
  • Count 序列元素个数或者满足指定条件的元素个数。
  • LongCount 返回元素个数(结果类型为Int64,也就是支持范围比较大)
  • Sum 累计。

排序操作

  • OrderBy 将序列升序。以非流式方式工作。该操作不查询数据。
  • OrderByDescending 将序列降序。以非流式方式工作。该操作不查询数据。
  • Reverse 反转序列。以非流式方式工作,该操作不查询数据。
  • ThenBy 对排序结果再次进行升序。以非流式方式工作,该操作不查询数据。
  • ThenByDescending 对排序结果再次进行降序。以非流式方式工作,该操作不查询数据。

集合操作

  • Concat 串联两个序列。该操作不查询数据。
  • Except 左集合减右集合的结果。右集合以非流式方式工作。该操作不查询数据。
  • Intersect 交集。右集合以非流式方式工作。该操作不查询数据。
  • Union 并集。该操作不查询数据。

筛选操作

  • Distinct 返回非重复元素组成的新序列。该操作不查询数据。
  • First 返回第一个元素或符合条件的第一个元素。
  • FirstOrDefault 返回第一个元素或符合条件的第一个元素。如没有返回默认。
  • Max 返回序列中最大的元素。
  • Min 返回序列中最小的元素。
  • Last 返回最后一个元素或最后一个符合条件的元素。
  • LastOrDefault 返回最后一个元素或最后一个符合条件的元素。如没有返回默认。
  • Single 返回唯一元素,或符合条件的唯一元素,如有多个报异常。
  • SingleOrDefault 返回唯一元素,或符合条件的唯一元素或默认值,如有多个报异常。
  • Where 条件筛选。该操作不查询数据。

判断操作

  • All(Func<T, bool>) : 测试序列是否都满足条件。T表示下一个元素。
  • Any 是否存在元素或是否存在符合条件的元素。
  • Contains 是否包含指定元素。
  • SequenceEqual 比较两序列是否相等。

联接投影分组操作

  • Select 序列每个元素根据转换函数产生投影。该操作不查询数据。
  • SelectMany 序列每个元素根据转换函数产生序列投影(一对多),最后串联所有投影序列。该操作不查询数据。
  • GroupBy 按指定键分组序列。以非流失方式工作。该操作不查询数据。
  • GroupJoin 近似左联接。右集合以非流式方式工作。该操作不查询数据。
  • Join 内联接。右集合以非流式方式工作。该操作不查询数据。
  • ToLookup 返回一对多的字典。

范围选择操作

  • ElementAt 返回指定位置的元素。
  • ElementAtOrDefault 返回指定位置的元素。当该位置没有返回默认。
  • Skip 跳过指定数目的元素,返回剩余元素组成的序列。该操作不查询数据。
  • SkipWhile 跳过元素,直到条件不符合,返回剩余元素组成的序列。该操作不查询数据。
  • Take 返回指定个数的元素组成的序列。该操作不查询数据。
  • TakeWhile 返回元素序列,直到条件不符合。该操作不查询数据。

生成操作

  • DefaultIfEmpty 如果是空序列,就返回一个默认或指定元素的新序列。 该操作不查询数据。
  • Empty 返回空序列。
  • Range 生成一个整数升序序列。该操作不查询数据。
  • Repeat 生成一个指定值的序列。该操作不查询数据。

转换操作

  • AsEnumerable 返回标准查询接口(非子类的特定接口)。 该操作不查询数据。
  • AsQueryable 返回IQueryable接口。该操作不查询数据。
  • Cast 返回标准查询接口,将元素类型强制转换,常用于非泛型序列。该操作不查询数据。
  • OfType 返回标准查询接口,将元素类型进行转换,如不能转换就放弃该元素,常用于非泛型序列。该操作不查询数据。
  • ToArray 返回数组。
  • ToDictionary 返回字典。
  • ToList 返回列表。