在过去如果我们如果需要去查询某些集合或者数组里面的某些元素,我们需要写出大量的带有筛选的遍历集合的代码,但是有了Linq之后,我们就不用写出那些冗余麻烦的遍历代码,只需要关注其中的筛选,排列的函数就可以实现了。Linq的语法看上去有点像SQL,完成的功能也和SQL相似,但是面向的数据不同且写法上也略有不同,下面介绍一下基本的使用。

  下面是一个使用的场景,要求从下面的名字中筛选出长度大于4的名字。

string[] names = new string[]{"zhang","li","liang","liao","cai","lie","gan","xian","lu","wang","chen"};

  那么我们在Linq上可以那么去做查询语句。

var result = from n in names
where n.Length >
select n;

  其中var这个选项,编译器会自动帮我们识别这是一个string的数组,from n是給查询数组中的子元素起个别名,类似于foreach中的创建一个局部变量,in names是指明查询的数据源,where语句是对其中的子元素进行筛选,如果n的长度大于4,那么就会返回那个子元素到查询数组里,select子句指明结果集中包含哪些元素,这是一个必须的查询语句。

  最后我们添加一段查询代码查看结果

foreach (string r in result) {
Console.WriteLine(r);
}

  得出的结果正符合我们所想的,如果上面的foreach查询语句不执行,那么这个linq语句就不会执行,这称为查询的延迟执行。

  其实Linq语句本质上是对实现了IEnumerable的接口的对象进行操作,而所有的数组和集合都实现了这个接口。下面介绍一下Linq常用的方法。

1.where

  where用于筛选数据源中的元素,只要给他指定数据源中的子元素的任意布尔值类型的表达式就可以了,例如字符串常用筛选布尔值返回表达式的如下:

n.Length >
n.Startwith("z");
n.Contains("h");

  where不是必须Linq使用里面必须指定的选项,但一般都要用到。

2.orderby

  类似于SQL,在对数据进行筛选之后,我们还可以进一步地对数据进行排序。

from n in names
where n.Length >
orderby n
select n;

  如果是倒叙排列,则需要在后面加descending。

orderby n descending

  如果我们这个数组元素不是单纯的字符串,而是一个学生对象,那个对象有学号,名字,我们要根据学号去排名,现在该怎么做呢?

orderby s.id

  当排序的对象需要根据多个字段去排序的时候,我们可以在orderby后面去添加多个元素,已,隔开。

orderby s.name, s.id

3.聚合函数

  和SQL一样,Linq也有Max(),Min(),Count(),Sum(),Average()这些聚合函数,继续沿用上面的学生对象例子,聚合函数需要在Linq表达式之后输出使用。

var r = from s in students
where s.name.Length >
orderby s.name descending
select s;
Console.Write("总数"+r.Count());
Console.Write("最高成绩"+r.Max(s => s.source));  //使用Lambda表达式指定返回学生的成绩
Console.Write("最低成绩"+r.Min(s => s.source));
Console.Write("总成绩"+r.sum(s => s.source));
Console.Write("平均成绩"+r.Average(s => s.source));

4.select

  select可以用以指定查询的具体字段,如只查询学生的学号,但是无法像SQL那样查询多个字段。

var r = from s in students
where s.name.Length >
select s.id;

5.Take和Skip

  Take和Skip可以用以进行前几个数据的筛选,一般用的场景如有查询最高成绩的学生,对查出来的信息进行分页。

  Take用来表明获取几个的数据,Skip用来省略前几项的数据,指偏移量,和MySQL的Limit的意思是一样的。

//取出成绩最高的三位学生
var result = (from s in students
orderby s.source descending
select s.source).Take();
//根据id查出学生信息,每页显示5个,当前是第2页
var result = (from s in students
orderby s.id
select s.source).Skip(*).Take();

最新文章

  1. jinfo_动态调整JVM参数(无需重启)(实践)
  2. viso图插入Word中大片空白解决办法
  3. 菜鸟学习笔记3——jQuery 选择器
  4. 关于js的一些基本知识(类,闭包,变量)
  5. 新型勒索软件Magniber正瞄准韩国、亚太地区开展攻击
  6. 搭建Hadoop集群(centos6.7+hadoop-2.7.3)
  7. Python生成唯一id的方法
  8. SSM项目问题中遇到 ArrayList添加元素的问题
  9. Lab 1-2
  10. docker镜像文件的导入与导出(docker镜像迁移)
  11. shiro 认证思路
  12. window.frames
  13. javascript 中 split 函数分割字符串成数组
  14. linux下如何删除十字符libudev.so病毒文件
  15. LOJ2540. 「PKUWC2018」随机算法【概率期望DP+状压DP】
  16. Network Emulator Toolkit (NEWT) 网络限速工具 (手机和电脑方面)
  17. QLoo graphql engine 学习三 架构
  18. Ubuntu16.04 静态IP配置
  19. 异步http请求的实现
  20. MyBatis框架的使用及源码分析(十) CacheExecutor,SimpleExecutor,BatchExecutor ,ReuseExecutor

热门文章

  1. C++ 头文件系列(stdexcept)
  2. 第五节 suid/ sgid /sbit /which /locate / find /stat / ln / uname -a
  3. virtual box未卸载报"Invalid Drive:F:\"的解决方案
  4. 安全扫描工具 Netsparker
  5. vue有关小知识
  6. [E::hts_idx_push] NO_COOR reads not in a single block at the end 10 -1
  7. e.target和this的区别
  8. C程序设计语言(第二版)--- 习题选
  9. Excel数据导入至Dataset中
  10. linux下vsftpd的安装及配置使用详细步骤