C# 语言集成查询 LINQ(Language Integrated Query)
提示:如有错误,请不吝指出
文章目录
- 注意
- 一、首先声明两个示例集合
- 二、LINQ多种操作方法
- 1.Select方法返回基于某具体类型的可枚举集合(指定的所有数据)
- 2.枚举器返回多个数据项
- 3.筛选数据
- 4.排序、分组、聚合数据
- 5.Join方法联接数据
- 6.使用查询操作符 这种方法为上述查询方法的简写
注意
注意:
- 1、在下面示例中的new{}表示的是返回两个或以上数据
- 2、Select(cust=>cust) 表示返回整行,而不是只投射特定的列
- 3、无论使用LINQ扩展方法还是查询操作符,当这些在执行的时候,应用程序并不真正构建集合;只有在遍历集合时才会对集合进行枚举,即最终获取到的始终是最新数据
- =推迟求值策略= 例如,从定义集合到遍历集合,再次期间如果更改address中的数据,就会看到最新的数据。
- 4、使用ToList方法构建静态List对象以包含数据的缓存拷贝
- 在定义LINQ查询是强制求值,生成一个静态的缓存的集合,该集合是原始数据的拷贝,如果原始集合中的数据发生改变,该拷贝中的数据不会发生改变
* eg:…from a in address.ToList() select a.CompanyName;
- 在定义LINQ查询是强制求值,生成一个静态的缓存的集合,该集合是原始数据的拷贝,如果原始集合中的数据发生改变,该拷贝中的数据不会发生改变
一、首先声明两个示例集合
var customers = new[]{new {CustomerID=1,FirstName="Kinm",LastName="AberCrim",CompanyName="Alpine"},new {CustomerID=2,FirstName="Jeff",LastName="Hay",CompanyName="Coho"},new {CustomerID=3,FirstName="Charlie",LastName="Herb",CompanyName="House"}};var address = new[] {new {CompanyName="Alpine",City="Berne",Country="Land"},new {CompanyName="A",City="B",Country="Land"},new {CompanyName="Coho",City="San",Country="US"},new {CompanyName="Trey",City="Microsoft",Country="London"}};
二、LINQ多种操作方法
1.Select方法返回基于某具体类型的可枚举集合(指定的所有数据)
Select其实是IEnumerable类的扩展方法,IEnumerable类System.Linq命名空间;在该命名空间中可以查看Enumerable.Select方法定义
IEnumerable<string> customerFirstNames = customers.Select(cust => cust.FirstName);// 后面的同理,使用foreach遍历可枚举集合
foreach (string name in customerFirstNames)
{Console.WriteLine(name);
}
2.枚举器返回多个数据项
方法1:将名字和姓氏连接成单个字符串
IEnumerable<string> customerName=customers.Select(cust => $"{cust.FirstName} {cust.LastName}");
方法2:定义新类型来封装多个数据项,并用Select方法构造该类型的实例
IEnumerable<FullName> customerFullNames = customers.Select(cust => new FullName { FirstName = cust.FirstName, LastName = cust.LastName });//class FullName
//{// public string FirstName { get; set; }//public string LastName { get; set; }
//}
方法3:使用匿名数组以及var
var customerFullName = customers.Select(data => new { FirstName = data.FirstName, LastName = data.LastName });
3.筛选数据
// 筛选数据// 要正确理解方法的应用顺序// 先应用where方法,筛选出符合条件的行;再应用Select方法,从而指定其中特定的字段#region 筛选数据Console.WriteLine("====================================================================================");IEnumerable<string> usCompanies = address.Where(addr => string.Equals(addr.Country, "London")).Select(usComp => usComp.CompanyName);foreach (string name in usCompanies){Console.WriteLine(name);}#endregion
4.排序、分组、聚合数据
#region 排序、分组、聚合数据// 使用OrderBy方法:按特定顺序获取数据(升序)// OrderByDescending方法(降序)// 按多个键来排序,在OrderBy方法或OrderByDescending方法之后使用ThenBy或ThenbyDescending方法IEnumerable<string> companyNames = address.OrderBy(addr => addr.CompanyName).Select(comp => comp.CompanyName);foreach (string name in companyNames){Console.WriteLine(name);}Console.WriteLine();// 使用GroupBy方法:按一个或多个字段中共同的值对数据进行分组(本例按国家对数组中的公司进行分组)var CompaniesGroupByCountry=address.GroupBy(addrs => addrs.Country); // 返回可枚举集合中 的 所有行 都依据该方法所指定的字段进行分组(多行数据)foreach (var companiesPerCountry in CompaniesGroupByCountry) // 逐行遍历{// Key字段访问作为分组依据的值,Count为数目 Max Min等Console.WriteLine($"Country:{companiesPerCountry.Key}\t{companiesPerCountry.Count()}");foreach (var companies in companiesPerCountry) // 遍历当前行的所有数据{Console.WriteLine($"\t{companies.CompanyName}");}}// 注意,该汇总方法不会区分包含相同值的字段int numberOfCompanies=address.Select(addr => addr.CompanyName).Count();Console.WriteLine($"Number of companies:{numberOfCompanies}");// 使用Distinct方法删除重复int numberOfDistinctCountries = address.Select(addr => addr.Country).Distinct().Count();Console.WriteLine($"Number of distinct countries: {numberOfDistinctCountries}");#endregion
5.Join方法联接数据
#region Join方法联接数据// 两个数组的匹配键是CompanyName,Select方法指定customers数组中感兴趣的字段(FirstName,LastName),以及指定了作为匹配键使用的字段CompanyName// 然后使用Join方法将Select标识的数据同另一个可枚举集合联接起来// Join方法的参数:// 1.要连接的目标可枚举集合// 2.一个对 Select方法标识数据 中的匹配键字段进行标识的方法// 3.一个对 目标集合 中的匹配键字段进行标识的方法// 4.一个对 Join方法返回的结果集合 中的 列 进行了标识的方法var companiesAndCustomers = customers.Select(c => new { c.FirstName, c.LastName, c.CompanyName }).Join(address, custs => custs.CompanyName, addrs => addrs.CompanyName,(custs, addrs) => new { custs.FirstName, custs.LastName, addrs.Country });foreach (var row in companiesAndCustomers){Console.WriteLine(row);}// 本例通过Join方法将两个数组联接起来,联接依据就是两个数组中的CompanyName字段值匹配,结果集合包含customers数组的FirstName字段和LastName字段以及address数组中的Country字段#endregion
6.使用查询操作符 这种方法为上述查询方法的简写
#region 使用查询操作符 这种方法为上述查询方法的简写,便于开发// 获取每个客户的名字var customersName=from cust in customers select cust.FirstName;//Select(cust=>cust):返回整行,而不是特定的列//var customersName1 = from cust in customers select cust;//foreach (var item in customersName1)//{// Console.WriteLine(item);//}// 获取每个客户的名字和姓氏var customerNames=from a in customers select new {a.FirstName,a.LastName};// 筛选数据用where (需要注意的是,在这里筛选出来的数据为集合,需要使用循环遍历输出)var usCompanies2 = from b in address where String.Equals(b.Country, "London") select b.CompanyName;// 数据排序用orderby (根据CompanyName字段进行排序,然后获取排序后的CompanyName字段)var companyNames2=from a in address orderby a.CompanyName select a.CompanyName;// 数据分组用group// 可以使用和以前一样的循环遍历结果var companiesGroupedByCountry = from a in address group a by a.Country;// Count方法int number1=(from a in address select a.CompanyName).Count();// Distinct方法 忽略重复值int number2=(from a in address select a.Country).Distinct().Count();// 统计集合中的行数int sumRows = address.Count();// Join操作符根据一个匹配键来联接两个集合 on和equals操作符指定两个集合如何关联 注意equals左边为“源”右边为“目标”// 当返回两个及以上数据的时候,使用new{}来进行返回var citiesAndCustomers = from a in address join c in customers on a.CompanyName equals c.CompanyName select new { c.FirstName, c.LastName, a.Country };#endregion
C# 语言集成查询 LINQ(Language Integrated Query)相关推荐
- 【翻译】Pro LINQ Language Integrated Query in C# 2008 -- 第三章 (LINQ TO Objects) 第一节
LINQ到Objects LINQ到Objects介绍 示例 3-1. 一个LINQ到Objects查询的示例. string[] presidents = { "Adams&quo ...
- unity的C#学习——foreach循环相关:IEnumerable接口、LINQ语言集成查询、可枚举对象与枚举类型
文章目录 C#里的判断和循环 1.foreach循环 2.IEnumerable接口 3.LINQ语言集成查询 4.可枚举对象和枚举类型的区别 C#里的判断和循环 C#和C语言都有条件语句和循环语句, ...
- Linq语言集成查询
Linq就是Language Integrated Query的缩写,即语言集成查询,是微软在.Net 3.5中提出的 一项新技术, Linq主要包含4个组件--Linq To Objects.Li ...
- 【开源库推荐】go-linq 强大的语言集成查询库如,ORM一般丝滑处理内存数据
在业务开发过程中除了业务逻辑.数据库之外主要就是数据转换处理过滤等相关的内容,比如合法性验证(可以使用"go-playground/validator")但是golang在数据处理 ...
- Linq语句集成查询
开发工具与关键技术: MVC 撰写时间:2021/6/18 Linq to SQL 全称基于关系数据的.NET 语言集成查询,用于以对象形式管理关系数据,我们常用Linq语句去查询SQL内的数据,可以 ...
- 再试译ScottGu's Posts 之 VS2008之语言特性--查询语法--New Orcas Language Feature: Query Syntax...
学习一门新的语言,总要从其语法学起.为了方便大家学习,同时也为了自己学习,就将ScottGu的这篇关于3.5中增加的新的特性帖子译了出来.这次我翻译采用中汉对照的方式,不然像上次译的那个那样的话不但我 ...
- 数据库语言 数据查询_使用这种简单的查询语言开始查询数据
数据库语言 数据查询 Working with data is becoming an increasingly important skill in the modern workplace. 在现 ...
- SpringEL 表达式语言(Spring Expression Language)
Spring学习总结:表达式语言 Spring Expression Language 目录 SpEL简介与功能特性 一.为什么需要Spring表达式语言 二.SpEL表达式Hello World! ...
- ElasticSearch DSL语言高级查询+SpringBoot
1 环境准备 1.1 Es数据准备 https://gitee.com/zhurongsheng/elasticsearch-data/blob/master/es.data 描述: 执行后查看结果. ...
最新文章
- 点云滤波/分割/关键点提取/配准/识别/重建教程
- html5和前端精要(2)-架构与基础(2)
- python一个月能掌握吗_Python 从入门到精通:一个月足够了!
- matlab连续型随机变量,matlab连续型随机变量的分布.doc
- C#联通新版验证码识别的实现[转]
- Q102:光线追踪场景(5)——驭龙台
- Flutter mixin用法详解
- 考研经验-东南大学软件学院软件工程(这些基础课和专业课的各种坑和复习技巧你应该知道)
- 深受企业青睐的华为云
- 运维工作的OKR愿景、战略和目标设计示例
- 使用java编写中国象棋(内含源代码)
- Invalid bound statement (not found)错误解决方法
- python学习笔记 BeautifulSoup趴数据
- 关闭伽卡他卡电子教室自动启动项
- 微信小程序之发送表情和文字和语音之php
- 蓝桥杯练习 小明上楼梯(递归设计)
- ConcurrentHashMap源码深度解析(一)(java8)——不可不知的基本概念(助你拿下源码事半功倍)
- 【PC工具】更新在线图片文字识别工具,OCR免费文字识别工具
- 为什么流量过万转化率却很低?
- EChar中的柱状图如何设置柱子的最大宽度和刻度的最小间隔
热门文章
- jquery - 定义二维数组
- 原生alert确定取消按钮
- 视频播放器—纹理-渲染-窗口
- org.apache.jasper.JasperException: The absolute uri: [http://java.sun.com/jsp/jstl/core] cannot be r
- 通过日期选择器输入时间并判断年龄(周岁)
- ijkplayer 播放mpeg2video编码视频花屏
- 关于python实现CRC32Mpeg2的应用和总结
- USB驱动——鼠标驱动程序(中断传输)
- Ansible的基本搭建安装与配置及各参数选项的作用
- 七、consul服务注册与发现