提示:如有错误,请不吝指出

文章目录

  • 注意
  • 一、首先声明两个示例集合
  • 二、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;

一、首先声明两个示例集合

         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)相关推荐

  1. 【翻译】Pro LINQ Language Integrated Query in C# 2008 -- 第三章 (LINQ TO Objects) 第一节

    LINQ到Objects LINQ到Objects介绍 示例 3-1. 一个LINQ到Objects查询的示例. string[] presidents = {     "Adams&quo ...

  2. unity的C#学习——foreach循环相关:IEnumerable接口、LINQ语言集成查询、可枚举对象与枚举类型

    文章目录 C#里的判断和循环 1.foreach循环 2.IEnumerable接口 3.LINQ语言集成查询 4.可枚举对象和枚举类型的区别 C#里的判断和循环 C#和C语言都有条件语句和循环语句, ...

  3. Linq语言集成查询

    Linq就是Language Integrated Query的缩写,即语言集成查询,是微软在.Net  3.5中提出的 一项新技术, Linq主要包含4个组件--Linq To Objects.Li ...

  4. 【开源库推荐】go-linq 强大的语言集成查询库如,ORM一般丝滑处理内存数据

    在业务开发过程中除了业务逻辑.数据库之外主要就是数据转换处理过滤等相关的内容,比如合法性验证(可以使用"go-playground/validator")但是golang在数据处理 ...

  5. Linq语句集成查询

    开发工具与关键技术: MVC 撰写时间:2021/6/18 Linq to SQL 全称基于关系数据的.NET 语言集成查询,用于以对象形式管理关系数据,我们常用Linq语句去查询SQL内的数据,可以 ...

  6. 再试译ScottGu's Posts 之 VS2008之语言特性--查询语法--New Orcas Language Feature: Query Syntax...

    学习一门新的语言,总要从其语法学起.为了方便大家学习,同时也为了自己学习,就将ScottGu的这篇关于3.5中增加的新的特性帖子译了出来.这次我翻译采用中汉对照的方式,不然像上次译的那个那样的话不但我 ...

  7. 数据库语言 数据查询_使用这种简单的查询语言开始查询数据

    数据库语言 数据查询 Working with data is becoming an increasingly important skill in the modern workplace. 在现 ...

  8. SpringEL 表达式语言(Spring Expression Language)

    Spring学习总结:表达式语言 Spring Expression Language 目录 SpEL简介与功能特性 一.为什么需要Spring表达式语言 二.SpEL表达式Hello World! ...

  9. ElasticSearch DSL语言高级查询+SpringBoot

    1 环境准备 1.1 Es数据准备 https://gitee.com/zhurongsheng/elasticsearch-data/blob/master/es.data 描述: 执行后查看结果. ...

最新文章

  1. 点云滤波/分割/关键点提取/配准/识别/重建教程
  2. html5和前端精要(2)-架构与基础(2)
  3. python一个月能掌握吗_Python 从入门到精通:一个月足够了!
  4. matlab连续型随机变量,matlab连续型随机变量的分布.doc
  5. C#联通新版验证码识别的实现[转]
  6. Q102:光线追踪场景(5)——驭龙台
  7. Flutter mixin用法详解
  8. 考研经验-东南大学软件学院软件工程(这些基础课和专业课的各种坑和复习技巧你应该知道)
  9. 深受企业青睐的华为云
  10. 运维工作的OKR愿景、战略和目标设计示例
  11. 使用java编写中国象棋(内含源代码)
  12. Invalid bound statement (not found)错误解决方法
  13. python学习笔记 BeautifulSoup趴数据
  14. 关闭伽卡他卡电子教室自动启动项
  15. 微信小程序之发送表情和文字和语音之php
  16. 蓝桥杯练习 小明上楼梯(递归设计)
  17. ConcurrentHashMap源码深度解析(一)(java8)——不可不知的基本概念(助你拿下源码事半功倍)
  18. 【PC工具】更新在线图片文字识别工具,OCR免费文字识别工具
  19. 为什么流量过万转化率却很低?
  20. EChar中的柱状图如何设置柱子的最大宽度和刻度的最小间隔

热门文章

  1. jquery - 定义二维数组
  2. 原生alert确定取消按钮
  3. 视频播放器—纹理-渲染-窗口
  4. org.apache.jasper.JasperException: The absolute uri: [http://java.sun.com/jsp/jstl/core] cannot be r
  5. 通过日期选择器输入时间并判断年龄(周岁)
  6. ijkplayer 播放mpeg2video编码视频花屏
  7. 关于python实现CRC32Mpeg2的应用和总结
  8. USB驱动——鼠标驱动程序(中断传输)
  9. Ansible的基本搭建安装与配置及各参数选项的作用
  10. 七、consul服务注册与发现