22.C#分组和查询延续及选择综合症(十一章11.6-11.7)

  对于昨天的连接还有一个知识点没有说,那就是分组连接。是11.5中的内容,补上。

  分组连接的格式:join 元素 in 序列

          on 条件表达式

          into 新的序列

  内连接和分组连接之间的一个重要差异(即分组连接和普通分组之间的差异)是,对于分组连接来说,在左边序列和结果序列之间是一对一的对应关系,即使左边序列中的某些元素在右边序列没有任何匹配的元素,也无所谓。这是非常重要的,有时会用于模拟SQL的左外连接。在左边元素不匹配任何右边元素的时候,嵌入序列就是空的。与内连接一样,分组连接要对右边序列进行缓冲,而对左边序列进行流处理。看代码吧。

 1 //使用分组连接
 2 var result7 = from box in boxList
 3               join item in list on box.jewelleryType equals item.Type into items
 4               select new { box, items };
 5 //使用分组连接给我的感觉就好像将一系列的珠宝(具有相同属性值),进行打包,当然生成的也是一个序列,而上
 6 //述中的box则作为存放这些一些相同属性珠宝的标识
 7 Console.WriteLine(result7.Count());
 8
 9 foreach (var re in result7)
10 {
11     Console.WriteLine(re.box.BoxName);
12     foreach (var item in re.items)
13     {
14         Console.WriteLine(item.Price);
15     }
16 }

  这里的代码是接着昨天的代码的,哈哈,可能要看看上一篇文章。

  • 使用多个from子句进行交叉连接和合并序列

  到目前为止,我们学到的连接都是相等连接--左边序列中的元素和右边序列要进行匹配。交叉连接不在序列之间执行任何匹配操作,它只尽可能列出所有的可能。我们新建一个类,叫Customer

1 class Customer
2 {
3     public string Name { get; set; }
4 }
 1 List<Jewellery> list = new List<Jewellery>()
 2 {
 3     new Jewellery() {Type=Jewellery.JewelleryType.Bracelet,State=Jewellery.JewelleryState.Repair,Price=100 },
 4     new Jewellery() {Type=Jewellery.JewelleryType.Necklace,State=Jewellery.JewelleryState.Sold,Price=200 },
 5     new Jewellery() {Type=Jewellery.JewelleryType.Ring,State=Jewellery.JewelleryState.Stock,Price=300 },
 6     new Jewellery() {Type=Jewellery.JewelleryType.Necklace,State=Jewellery.JewelleryState.Sold,Price=400 },
 7     new Jewellery() {Type=Jewellery.JewelleryType.Bracelet,State=Jewellery.JewelleryState.Stock,Price=500 },
 8     new Jewellery() {Type=Jewellery.JewelleryType.Ring,State=Jewellery.JewelleryState.Repair,Price=600 }
 9 };
10
11 List<Customer> ctrList = new List<Customer>()
12 {
13     new Customer() {Name="111" },
14     new Customer() {Name="222" },
15     new Customer() {Name="333" },
16     new Customer() {Name="444" },
17     new Customer() {Name="555" }
18 };
19
20 var result9 = from ctr in ctrList
21               from jly in list
22               select new { ctr, jly };
23 Console.WriteLine(result9.Count());

  结果为30,因为珠宝有6件,顾客有5人,5*6=30。可见,使用两个from子句可能交叉连接返回所有组合的序列。

  • 使用group...by子句进行分组

  格式:group 元素 by 关键字

  grouping表达式通过其键来决定序列如何分组。整个结果是一个序列,序列中的每个元素本身就是投影后元素的序列,还具有一个Key属性,即用于分组的键。下面来做一个操作,用珠宝的类型进行分组。

 1 var result10 = from jly in list
 2                group jly by jly.Type;
 3
 4 Console.WriteLine(result10.Count());
 5
 6 foreach (var jlys in result10)
 7 {
 8     Console.WriteLine(jlys.Key);
 9     foreach(var jly in jlys)
10     {
11         Console.WriteLine(jly.Price);
12     }
13 }

感觉和使用join...into子句出来的效果是一样的,但是使用group...by更能让人理解。

  • 查询延续

  查询延续提供了一种方式,把一个查询表达式的结果用作另一个查询表达式的初始序列。它可以应用于group..by和select子句上,语法对于两者是一样的,只需要使用上下文关键字into,如要查询每种类型珠宝的数量,可以这样表示。

1 var result11 = from jly in list
2                group jly by jly.Type into jlys
3                select new { Type = jlys.Key, Count = jlys.Count() };
4
5 foreach(var item in result11)
6 {
7     Console.WriteLine(item.Type);
8     Console.WriteLine(item.Count);
9 }

结果为:

表明每一种类型都有两件珠宝。

  • 使用LINQ表达式还是使用扩展方法

  对于如何选择,每个心中都有数,这里只说下两者的关系。

  每个查询表达式都可能使用扩展方法来表示,但很多LING操作在C#中不存在等价的查询表达式。

  请斧正,抱一个学习的心态认真地做一件事情。

时间: 2024-08-27 12:00:57

22.C#分组和查询延续及选择综合症(十一章11.6-11.7)的相关文章

分组统计查询

分组统计查询 范例1:查找出公司每个月支出的月工资的总和 SELECT SUM(sal) FROM emp ;   范例2:查询出公司的最高工资.最低工资.平均工资 SELECT AVG(sal), ROUND(AVG(sal),2), MAX(sal), MIN(sal) FROM emp ;   范例3:统计出公司最早雇佣和最晚雇佣的雇佣日期 SELECT MIN(hiredate) 最早雇佣日期 , MAX(hiredate) 最晚雇佣日期 FROM emp ; 范例4:统计公司中间的工资

MSSQL 4表联查,子查询,函数统计,分组条件查询综合应用实例

1 SELECT 2 [UserName] 3 ,[Yhxm] 4 ,[Qx] 5 ,[Phone] 6 ,[Number] = COUNT([UserName]) 7 FROM 8 (SELECT 9 [UserName] = A.[username] 10 ,[Yhxm] = B.[xm] 11 ,[Qx] = D.[P_Power] 12 ,[Phone] = B.[dh] 13 ,[DayCount] = (SELECT COUNT(*) FROM [Caihuashun_FuJian_

010.简单查询、分组统计查询、多表连接查询(sql实例)

-------------------------------------day3------------ --添加多行数据:------INSERT [INTO] 表名 [(列的列表)] --SELECT UNION --SELECT 'HAHA',1,32--UNION ALL --全部显示/显示重复数据 即使集合相同--UNION---------将查询的两个结果集合并.结构必须一致 -->常见面试题 --SELECT 'HEHE',2,33------将查询结果添加到列表中(子查询)IN

003.分组统计查询和表连接查询

--分组统计查询 group by having 1 select 分组字段 ,聚合函数 2 having 后常跟聚合函数,也可以跟分组字段 3 where 后不可以直接跟聚合函数 4 where(筛选行) -group by (分组) -having (筛选组) --表连接查询 1 笛卡尔积 (交叉连接 cross join) a*b A) SELECT * FROM A,B B) SELECT * FROM A CROSS JOIN B 2 内连接 原理: 将两个表中关联字段相等的行查询出来

crm使用FetchXml分组聚合查询

/* 创建者:菜刀居士的博客 * 创建日期:2014年07月09号 */ namespace Net.CRM.FetchXml { using System; using Microsoft.Xrm.Sdk; using Microsoft.Xrm.Sdk.Query; /// <summary> /// 使用FetchXml聚合查询,分组依据 /// </summary> public class FetchXmlExtension { /// <summary> /

分组统计查询(章节摘要)

1,在SQL中主要提供了5种分组函数,分别是COUNT(),AVG(),SUM(),MIN(),MAX()函数. 2,使用GROUP BY字句可以对数据进行分组操作,而使用HAVING字句可以对分组之后的数据进行再次过滤. 3,在分组时可以同时制定多个分组字段. 4,分组操作不仅可以用于实体表,也可以针对查询的临时表进行分组. 5,分组函数允许嵌套,但是嵌套之后的分组查询中不能再出现任何字段,包括分组字段.分组统计查询(章节摘要)

sql 分组统计查询并横纵坐标转换

关于sql 分组统计查询,我们在做报表的时候经常需要用到;今天就在这里整理下; 先附上一段sql代码: if object_id(N'#mytb',N'U') is not null drop table #mytbgodeclare @Year intset @Year=2014create table #mytb ([Date] int,[Count] int,[Price] decimal(18, 0),[spbm] varchar(50),[sppp] varchar(100),[spm

Oracle数据库从入门到精通-分组统计查询

视频课程:李兴华 Oracle从入门到精通 视频课程学习者:阳光罗诺 视频来源:51CTO学院 整体内容: 统计函数的使用 分组统计查询的实现 对分组的数据过滤 统计函数 在之前我们就学习过一个COUNT()函数,这个函数的主要作用是统计一张表之中的数据量的个数.和它功能与之类似的常用函数有五个: 统计个数COUNT():根据表中的实际数据量返回结果. 求和SUM():是针对于数字的统计 平均值AVG():是针对数字的统计 最小值MIN():各种数据类型都支持. 最大值MAX():各种数据类型都

《卸甲笔记》-分组统计查询

统计函数对比 1查询出公司每个月支出的月工资总和 Oracle SQL> select SUM(sal) from emp; SUM(SAL) ---------- 29025 PPAS scott=# select SUM(sal) from emp; sum ---------- 29025.00 (1 row) 2查询出公司的最高工资,最低工资,平均工资 Oracle SQL> select AVG(sal),ROUND(AVG(sal),2),MAX(sal),MIN(sal) fro