LINQ实践教程

本教程旨在快速掌握LINQ基础用法,以及在此基础上构建复杂LINQ查询,没有任何啰嗦,直接上手。

示例1:最简单的LINQ查询

int[] numbers = { 5, 1, 8, 6, 2, 6, 4, 9, 10, 7, 3 };
var nums1 = from n in numbers where n < 5 select n;
foreach (var x in nums1)
{
Console.Write("{0}, ", x);
}
输出结果:
1, 2, 4, 3,

示例2:使用LINQ函数查询

int[] numbers = { 5, 1, 8, 6, 2, 6, 4, 9, 10, 7, 3 };
var nums1 = numbers.Where(n => n < 5);
foreach (var x in nums1)
{
Console.Write("{0}, ", x);
}
输出结果:

1, 2, 4, 3,

示例3:使用join子句

join类似于SQL中的join

Student[] students =
{
new Student {Id = 1, Name = "Zhangsan"},
new Student {Id = 2, Name = "Lisi"},
new Student {Id = 3, Name = "Wangwu"}
};
StudentCourse[] studentCourses =
{
new StudentCourse {Id = 1, CourseName = "Math"},
new StudentCourse {Id = 1, CourseName = "Chinese"},
new StudentCourse {Id = 2, CourseName = "Math"},
new StudentCourse {Id = 2, CourseName = "English"},
new StudentCourse {Id = 3, CourseName = "Math"}
};

var sc = from s in students
join c in studentCourses on s.Id equals c.Id
where c.Id == 1
select new {s, c};
foreach (var student in sc)
{
Console.WriteLine("Id={0}, Name={1}, Course={2}", student.s.Id, student.s.Name, student.c.CourseName);
}
输出结果:

Id=1, Name=Zhangsan, Course=Math
Id=1, Name=Zhangsan, Course=Chinese

示例4:使用let子句

let子句接受一个表达式的运算并把它赋值给一个需要在其他运算中使用的标识符。

var group1 = new int[] {3, 4, 5, 6};
var group2 = new int[] {6, 7, 8, 9};
//找出能够满足两数相加为12的所有数据
var someInts = from a in group1
from b in group2
let sum = a + b
where sum == 12
select new {a, b, sum};
foreach (var x in someInts)
{
Console.WriteLine(x);
}
输出结果:

{ a = 3, b = 9, sum = 12 }
{ a = 4, b = 8, sum = 12 }
{ a = 5, b = 7, sum = 12 }
{ a = 6, b = 6, sum = 12 }

示例5:使用orderby子句

注意,与SQL不同,order和by之间没有空格,默认排序是升序,可以使用ascending和descending关键字设定排序方式

int[] numbers = { 5, 1, 8, 6, 2, 6, 4, 9, 10, 7, 3 };
var results = from n in numbers where n < 5 orderby n descending select n;
foreach (var result in results)
{
Console.WriteLine(result);
}
输出结果:

4
3
2
1

示例6:使用group...by子句

StudentCourse[] studentCourses =
{
new StudentCourse {Id = 1, CourseName = "Math"},
new StudentCourse {Id = 1, CourseName = "Chinese"},
new StudentCourse {Id = 2, CourseName = "Math"},
new StudentCourse {Id = 2, CourseName = "English"},
new StudentCourse {Id = 3, CourseName = "Math"}
};
var query = from sc in studentCourses
group sc by sc.CourseName;
foreach (var sc in query)
{
Console.WriteLine("Current Group Key={0}",sc.Key);//sc.Key是当前分组的Key值
//注意,这里需要再次迭代才能获取实际数据的值
foreach (var s in sc)
{
Console.WriteLine(" Id={0}, CourseName={1}", s.Id, s.CourseName);
}
}
输出结果:

Current Group Key=Math
Id=1, CourseName=Math
Id=2, CourseName=Math
Id=3, CourseName=Math
Current Group Key=Chinese
Id=1, CourseName=Chinese
Current Group Key=English
Id=2, CourseName=English

示例7:查询延续:使用into子句

var group1 = new int[] { 3, 4, 5, 6 };
var group2 = new int[] { 4, 5, 6, 7 };
var query = from a in group1
join b in group2 on a equals b
into group12//查询延续
from c in group12
select c;
foreach (var item in query)
{
Console.WriteLine(item);
}
输出结果:

4
5
6

示例8:标准查询运算符

标准查询运算符由一系列API组成,它能让我们查询任何。NET数组或集合。标准查询运算符的主要特征如下:

被查询的集合对象叫做序列,它必须实现IEnumerable<T>接口
标准查询运算符使用函数语法
一些运算符返回Ienumerable对象(或其他序列),而其他也些运算符返回标量。返回标量的运算符立即执行,并返回一个值,而不是可枚举类型对象。
很多操作都以一个谓词作为参数,谓词是一个方法,它以对象作为参数,根据对象是否满足某个条件而返回true或false
如下代码演示了Sum和Count的使用:

var numbers = new int[] {2, 3, 5};
int total = numbers.Sum();
int count = numbers.Count();
Console.WriteLine("Total={0}, Count={1}", total, count);
输出结果:

Total=10, Count=3

以下是全部标准查询运算符,大家可以点进去查看具体使用方法:

时间: 2025-01-16 08:33:30

LINQ实践教程的相关文章

VS单元测试入门实践教程

摘要:本教程不会介绍单元测试的基本理论知识,也不会和大家讨论在实际项目中是否需要写单元测试代码的问题.但是如果你此时想使用VS中的单元测试的工具来测试某个方法是否正确,可你又从来没真正实践过,那么本教程将带你一步一步使用VS2010集成的Unit Test进行断言(Assert)式验证数据的正确性,及代码覆盖率的查看. 关键词:Unit Test.单元测试.代码覆盖率.Assert.Twifly 正文: 在本入门教程中我们假设来测试一个简单的加法运算方法是否正确.该方法能够接受任意个参数,参数类

进程和程序:编写shell——《Unix/Linux编程实践教程》读书笔记(第8章)

1.Unix shell的功能 shell是一个管理进程和运行程序的程序.所有常用的shell都有3个主要功能: (1)运行程序: (2)管理输入和输出 (3)可编程 shell同时也是带有变量和流程控制的编程语言. 2.Unix的进程模型 一个程序是存储在文件中的机器指令序列,一般它是由编译器将源代码编译成二进制格式的代码.运行一个程序意味着将这些机器指令序列载入内存然后让处理器(CPU)逐条执行.在Unix术语中,一个可执行程序是一些机器指令机器数据的序列.一个进程是程序运行时的内存空间和设

系统调用操作文件——《Unix/Linux编程实践教程》读书笔记

1.who命令通过读系统日志的内容显示当前已经登录的用户. 2.Unix系统把数据存放在文件中,可以通过以下系统调用操作文件: open(filename, how) creat(filename, mode) read(fd, buffer, amt) write(fd, buffer, amt) lseek(fd, distance, base) close(fd) 3.进程对文件的读/写都要通过文件描述符,文件描述符表示文件和进程之间的连接. 4.每次系统调用都会导致用户模式和内核模式的切

终端控制和和信号——《Unix/Linux编程实践教程》读书笔记(第6章)

1.有些程序处理从特定设备来的数据.这些与特定设备相关的程序必须控制与设备的连接.Unix系统中最常见的设备是终端. 2.终端驱动程序有很多设置.各个设置的特定值决定了终端驱动程序的模式.为用户编写的程序通常需要设置终端驱动程序为特定的模式. 3.键盘输入分为3类,终端驱动程序对这些输入做不同的处理.大多数建代表常规数据,它们从驱动程序传输到程序.有些键调用驱动程序中的编辑函数.如果按下删除键,驱动程序将前一个字符从它的行缓冲中删除,并将命令发送到终端屏幕,使之从显示器中删除字符.最后,有些键调

目录与文件属性——《Unix/Linux编程实践教程》读书笔记

1.ls产生一个文件名的列表,它大致是这样工作的: open directory +-> read entry - end of dir? -+ |__ display file info | close directory <--------------+ 2.目录是一种特殊的文件,它的内容是文件和目录的名字.与普通文件不同的是,目录文件永远不会空,每个目录至少包含2个特殊的项,即 "."和"..",其中 "."不是当前目录,&qu

网页图表Highcharts实践教程之图表代码构成

网页图表Highcharts实践教程之图表代码构成 Highcharts第一个实例 下面我们来实现本书的第一个Highcharts实例. [实例1-1]下面来制作北京连续一周最高温度折线图.操作过程如下: (1)新建一个网页文件,命名为Hello.html.同时,将title设置为Hello Highcharts.代码如下: <html lang="en" xmlns="http://www.w3.org/1999/xhtml"> <head>

网页图表Highcharts实践教程之认识Highcharts

网页图表Highcharts实践教程之认识Highcharts 第1章  认识Highcharts Highcharts是国际知名的一款图表插件.它完全使用Javascript编写实现.其结构清晰,使用简单.开发人员可以很轻松地构建出常见的各种图表类型.本章将简要介绍Highcharts的特点,并实现第一个Highcharts图表. Highcharts概述 为了更好学习Highcharts的使用,我们首先了解如何获取Highchrts插件和Highcharts所支持的图表类型. 下载Highc

网页图表Highcharts实践教程之图表区

网页图表Highcharts实践教程之图表区 网页图表Highcharts图表区 图表区是图表的基本区域.所有的数据和图形都是绘制在图表区中.从图形绘制范围来分,图表区域分为外层图表区和绘图区.本章将详细讲解图表区的设置和创建. 网页图表Highcharts图表区的构成 为了方便管理,Highcharts将所有的图表元素都绘制在一个Box区域内,如图2.1所示.这个区域被称为图表区.由于图表中最重要的数据就是图表图形,所以图表图形所在的区域又构成一个独立的区域,称为绘图区,如图2.1所示. 图2

网页图表Highcharts实践教程之外层图表区

网页图表Highcharts实践教程之外层图表区 Highcharts图表区 图表区是图表的基本区域.所有的数据和图形都是绘制在图表区中.从图形绘制范围来分,图表区域分为外层图表区和绘图区.本章将详细讲解图表区的设置和创建. Highcharts图表区的构成 为了方便管理,Highcharts将所有的图表元素都绘制在一个Box区域内,如图2.1所示.这个区域被称为图表区.由于图表中最重要的数据就是图表图形,所以图表图形所在的区域又构成一个独立的区域,称为绘图区,如图2.1所示. 图2.1  图表