Language Integrated Query(LINQ,语言集成查询)

第一次接触到Linq很开心

Linq 有两种写法,一种是 语句,另一种是^表达式

linq用来遍历集合很方便,和foreach相比,在处理某些方面很有优点。比如筛选,分组...,因此 我把Linq理解成一种别样的sql,但两者的区别就像大象和故宫。

与LINQ有关的语言特性

首先呢,LINQ 要先知道 1.隐式类型,2.匿名类型,3.自动属性,4委托,5泛型,6.Lambda表达式,7.迭代器 

先说一些简单的

元素操作符

这些元素操作符仅返回一个元素,不是IEnumerable。(默认值:值类型默认为0,引用类型默认为null)

1)First:返回序列中的第一个元素;如果是空序列,此方法将引发异常。

2)FirstOrDefault:返回序列中的第一个元素;如果是空序列,则返回默认值default(TSource)。

3)Last:返回序列的最后一个元素;如果是空序列,此方法将引发异常。

4)LastOrDefault:返回序列中的最后一个元素;如果是空序列,则返回默认值default(TSource)。

5)Single:返回序列的唯一元素;如果是空序列或序列包含多个元素,此方法将引发异常。

6)SingleOrDefault:返回序列中的唯一元素;如果是空序列,则返回默认值default(TSource);如果该序列包含多个元素,此方法将引发异常。

7)ElementAt:返回序列中指定索引处的元素,索引从0开始;如果索引超出范围,此方法将引发异常。

8)ElementAtOrDefault:返回序列中指定索引处的元素,索引从0开始;如果索引超出范围,则返回默认值default(TSource)。

9)Count:返回一个System.Int32,表示序列中的元素的总数量。

10)LongCount:返回一个System.Int64,表示序列中的元素的总数量。

11)Sum:计算序列中元素值的总和。

12)Max:返回序列中的最大值。

13)Min:返回序列中的最小值。

14)Average:计算序列的平均值。

这些东西我们在操作集合的时候都经常用到

1. where 筛选

List<int>  intList = new List(){1, 3, 4 , 6, 8, 4};

比如筛选 大于 3 的数字

^表达式         var tmp = intList.Where(a => a >3).toList(); 

Linq 语句       var tmp = (from i in intList where i > 3 select i).ToList();   

不加 toList() 是延迟加载的懒惰模式,否则会在遍历的时候才会有数据

OfType<int>() 可以获取所有的int类型的数据,也能和Where连用,比如

var tmp = intList.OfType<int>().Where(a => a >3).toList();

2. select 投影

将集合中的每个元素投影的新集合中。这句话的意思是说,会将筛选出来的数据放到一个新的集合 IEnumerable<T> 中比如;

IEnumerable<String> tmp = intList.Where(a => a >3).Select<int, String>(a => (a + 1).ToString());

这样 这就可以顺便理解一下为什么 不加 toList() 是延迟加载的懒惰模式,否则会在遍历的时候才会有数据

SelectMany  则是将序列的每个元素投影到一个序列中,最终把所有的序列合并 SelectMany 多出一个 合并 相当于再遍历的时候可以少一层循环

3.分组

说的再多,不如Demo

from a in scource  可以理解为  foreach (var a in scource),foreach中可以写var 也可以指定a 的类型, 这里也一样,a 前面也可以加类型

from a in scource let num = a where a > 3 &&num % 2 == 0  可以理解为 用 let 添加一些临时变量 

 group v by v.id into g 

into 的作用呢是将前面语句的结果作为后面语句操作的数据源,g相当于拿到所有按id分组的数据

注:直接出现在join子句之后的into关键字会被翻译为GroupJoin。(into之前的查询变量可以继续使用

而 select或group子句之后的into它会重新开始一个查询,让我们可以继续引入where, orderby和select子句,是对分步构建查询表达式的一种简写方式。(into之前的查询变量都不可再使用

g 有key 可以查看 按什么分的组

count 是统计的个数

count(lanmud) 也可以适用,只是这样的统计是对分组之后的数据进行统计

上面的例子 是 按 v.id 分组,然后返回的分别是 id, 统计个数, 分组之后 name是小红的个数

4 排序

如果想按id 升序 可以 写成  from v in obj orderby v.id group v by v.id into g 

如果想按id 降序 可以 写成  from v in OrderByDescending v.id group v by v.id into g 

多个排序 用 , 隔开, 

方法语句

obj.Orderby(a => a.id).ThenOrderby(a => a.name).ThenOrderByDescending(a => a.id);

Reverse()可以翻转顺序

5连接

join…in…on…equals…

指定多个数据源的关联方式

可以使用匿名类型来对多个键值进行Join,如下所示:

from x in sequenceX

join y in sequenceY on new { K1 = x.Prop1, K2 = x.Prop2 }

equals new { K1 = y.Prop3, K2 = y.Prop4 }

//等待贴代码

6.量词操作符

如果元素序列满足指定的条件,量词操作符就返回布尔值。

1)Any:确定序列是否包含任何元素;或确定序列中的任何元素是否都满足条件。

2)All:确定序列中的所有元素是否满足条件。

3)Contains:确定序列是否包含指定的元素。

例如 var tmp = (from i in intList where i > 3 select i).ToList();

tmp.Any(r => r == 3) 返回 true

tmp.All(r => r == 3)  返回 false

tmp.Contains(3)  返回 true

7.分区操作符(分页操作)

添加在查询的“最后”,返回集合的一个子集。

1)Take:从序列的开头返回指定数量的连续元素。

2)TakeWhile:只要满足指定的条件,就会返回序列的元素。

3)Skip:跳过序列中指定数量的元素,然后返回剩余的元素。

4)SkipWhile:只要满足指定的条件,就跳过序列中的元素,然后返回剩余元素。

8.集合操作符

1)Union:并集,返回两个序列的并集,去掉重复元素。

2)Concat:并集,返回两个序列的并集。

3)Intersect:交集,返回两个序列中都有的元素,即交集。

4)Except:差集,返回只出现在一个序列中的元素,即差集。

5)Zip:通过使用指定的委托函数合并两个序列,集合的总个数不变。

6)SequenceEqual:判断两个序列是否相等,需要内容及顺序都相等。

9


小结

以上是 Linq的一个简单认识

还有很多不明白的,不会的,我会不断完善的。希望大神能指点一条进阶之路,或者谈谈感悟,不胜感激,感激不尽~

最后 感谢下某位大佬,传送门 

稍等,记录一下尚且不明白的内容:

1 .会把“复合from子句”的查询表达式转换为SelectMany()扩展方法



最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,482评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,377评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,762评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,273评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,289评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,046评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,351评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,988评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,476评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,948评论 2 324
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,064评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,712评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,261评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,264评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,486评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,511评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,802评论 2 345

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,599评论 18 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,581评论 18 399
  • //Clojure入门教程: Clojure – Functional Programming for the J...
    葡萄喃喃呓语阅读 3,618评论 0 7
  • 如果你不能飞,那就跑; 如果跑不动,那就走; 实在走不动了,那就爬。 记住: 无论做什么,你都要勇往直前; 无论有...
    远芳阅读 185评论 0 0
  • 突然突发奇想的想结婚,并不是因为遇到了,只是就想嫁了,想有自己的一个窝。 记得前几天一闺蜜和我说她好累好累,人生好...
    花开彼岸情守一端阅读 161评论 0 0