在过去如果我们如果需要去查询某些集合或者数组里面的某些元素,我们需要写出大量的带有筛选的遍历集合的代码,但是有了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();

C#的LINQ的更多相关文章

  1. Linq表达式、Lambda表达式你更喜欢哪个?

    什么是Linq表达式?什么是Lambda表达式? 如图: 由此可见Linq表达式和Lambda表达式并没有什么可比性. 那与Lambda表达式相关的整条语句称作什么呢?在微软并没有给出官方的命名,在& ...

  2. Linq之旅:Linq入门详解(Linq to Objects)

    示例代码下载:Linq之旅:Linq入门详解(Linq to Objects) 本博文详细介绍 .NET 3.5 中引入的重要功能:Language Integrated Query(LINQ,语言集 ...

  3. [C#] 走进 LINQ 的世界

    走进 LINQ 的世界 序 在此之前曾发表过三篇关于 LINQ 的随笔: 进阶:<LINQ 标准查询操作概述>(强烈推荐) 技巧:<Linq To Objects - 如何操作字符串 ...

  4. [C#] 进阶 - LINQ 标准查询操作概述

    LINQ 标准查询操作概述 序 “标准查询运算符”是组成语言集成查询 (LINQ) 模式的方法.大多数这些方法都在序列上运行,其中的序列是一个对象,其类型实现了IEnumerable<T> ...

  5. LINQ to SQL语句(7)之Exists/In/Any/All/Contains

    适用场景:用于判断集合中元素,进一步缩小范围. Any 说明:用于判断集合中是否有元素满足某一条件:不延迟.(若条件为空,则集合只要不为空就返回True,否则为False).有2种形式,分别为简单形式 ...

  6. .NET深入实战系列—Linq to Sql进阶

    最近在写代码的过程中用到了Linq查询,在查找资料的过程中发现网上的资料千奇百怪,于是自己整理了一些关于Linq中容易让人困惑的地方. 本文全部代码基于:UserInfo与Class两个表,其中Cla ...

  7. LINQ Group By操作

    在上篇文章 .NET应用程序与数据库交互的若干问题 这篇文章中,讨论了一个计算热门商圈的问题,现在在这里扩展一下,假设我们需要从两张表中统计出热门商圈,这两张表内容如下: 上表是所有政区,商圈中的餐饮 ...

  8. Entity Framework 6 Recipes 2nd Edition(11-9)译 -> 在LINQ中使用规范函数

    11-9. 在LINQ中使用规范函数 问题 想在一个LINQ查询中使用规范函数 解决方案 假设我们已经有一个影片租赁(MovieRental )实体,它保存某个影片什么时候租出及还回来,以及滞纳金等, ...

  9. Entity Framework 6 Recipes 2nd Edition(11-11)译 -> 在LINQ中调用数据库函数

    11-11. 在LINQ中调用数据库函数 问题 相要在一个LINQ 查询中调用数据库函数. 解决方案 假设有一个任命(Appointment )实体模型,如Figure 11-11.所示, 我们想要查 ...

  10. Entity Framework 6 Recipes 2nd Edition(13-6)译 -> 自动编译的LINQ查询

    问题 你想为多次用到的查询提高性能,而且你不想添加额外的编码或配置. 解决方案 假设你有如Figure 13-8 所示的模型 Figure 13-8. A model with an Associat ...

随机推荐

  1. Wincc flexable的局势视图的组态

    1.趋势视图介绍 2.实时趋势视图的组态 1)创建连接和变量 2)开始组态局势视图 3)设置趋势视图的属性,添加一个趋势 3.模拟运行HMI,观察局势图

  2. 计算机和HMI设备通信之程序上下载

    1.传送模式 2.串行接口传送HMI,软件采用Wincc flexable smart v3 3.设置HMI设备,给HMI设备上电 打开控制面板,双击Transfer 使能Enable Channel ...

  3. PHP判断手机号运营商(详细介绍附代码)

    道理很简单,知道手机号规则 进行正则判断就可以 移动:134.135.136.137.138.139.150.151.157(TD).158.159.187.188 联通:130.131.132.15 ...

  4. Hello 2018, Bye 2017

    2017年过去了,过去一年经历了太多,改变了好多好多,可以说人生进入了另一个阶段,有可能是成熟吧. 回顾2017 去年换了新工作,离开了将近工作了8年的公司,不带走一丝云彩,为其任劳任怨,最后没有任何 ...

  5. java复写equals例子

    public class users { String name; static int age; public boolean equals(Object obj) { if(this==obj){ ...

  6. 在表格中,th scope="row"和th scope="col"中的scope属性的用法及意义

    把表头和数据联系起来:scope,id,headers属性就我用到现在,很多表格要比上面提供的例子复杂的多.让例子复杂一点,我会移去"Company"表头,并且把第一列的数据移到表 ...

  7. eval基础,基础用法及解析json

    <body> <!-- eval 的使用:eval(string) 计算某个字符串,并执行其中的js代码 字符串上运用 eval() eval("x = 10;y = 2; ...

  8. 云计算---openstack镜像制作详解

    一:本地部署KVM 1.安装KVM 1.1安装须知 查看CPU是否支持kvm完全虚拟机. [root@LINUX ~]# grep "flags" /proc/cpuinfofla ...

  9. 命令行执行Django脚本的方法

    update.py import os import sys import django sys.path.append(r'C:\Users\Administrator\PycharmProject ...

  10. 豹哥嵌入式讲堂:ARM开发之文件详解(3)- project文件

    大家好,我是豹哥,猎豹的豹,犀利哥的哥.今天豹哥给大家讲的是嵌入式开发里的project文件. 前面两节课里,豹哥分别给大家介绍了嵌入式开发中的两种典型input文件:source文件.linker文 ...