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

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

          on 条件表达式

          into 新的序列

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

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

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

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

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

 class Customer
{
public string Name { get; set; }
}
 List<Jewellery> list = new List<Jewellery>()
{
new Jewellery() {Type=Jewellery.JewelleryType.Bracelet,State=Jewellery.JewelleryState.Repair,Price= },
new Jewellery() {Type=Jewellery.JewelleryType.Necklace,State=Jewellery.JewelleryState.Sold,Price= },
new Jewellery() {Type=Jewellery.JewelleryType.Ring,State=Jewellery.JewelleryState.Stock,Price= },
new Jewellery() {Type=Jewellery.JewelleryType.Necklace,State=Jewellery.JewelleryState.Sold,Price= },
new Jewellery() {Type=Jewellery.JewelleryType.Bracelet,State=Jewellery.JewelleryState.Stock,Price= },
new Jewellery() {Type=Jewellery.JewelleryType.Ring,State=Jewellery.JewelleryState.Repair,Price= }
}; List<Customer> ctrList = new List<Customer>()
{
new Customer() {Name="" },
new Customer() {Name="" },
new Customer() {Name="" },
new Customer() {Name="" },
new Customer() {Name="" }
}; var result9 = from ctr in ctrList
from jly in list
select new { ctr, jly };
Console.WriteLine(result9.Count());

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

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

  格式:group 元素 by 关键字

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

 var result10 = from jly in list
group jly by jly.Type; Console.WriteLine(result10.Count()); foreach (var jlys in result10)
{
Console.WriteLine(jlys.Key);
foreach(var jly in jlys)
{
Console.WriteLine(jly.Price);
}
}

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

  • 查询延续

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

 var result11 = from jly in list
group jly by jly.Type into jlys
select new { Type = jlys.Key, Count = jlys.Count() }; foreach(var item in result11)
{
Console.WriteLine(item.Type);
Console.WriteLine(item.Count);
}

结果为:

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

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

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

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

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

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

  1. CPrimerPlus第十一章中的“选择排序算法”学习

    C Primer Plus第十一章字符串排序程序11.25中,涉及到“选择排序算法”,这也是找工作笔试或面试可能会遇到的题目,下面谈谈自己的理解. 举个例子:对数组num[5]={3,5,2,1,4} ...

  2. 【MySQL】条件查询之排序聚合分组分页查询

    排序查询 语法:order by 子句 order by 排序字段1 排序方式1 , 排序字段2 排序方式2... 排序方式: ASC:升序,默认的. DESC:降序. 注意: 如果有多个排序条件,则 ...

  3. SQL Fundamentals: 分组统计查询(FROM-WHERE-GROUPBY-HAVING-SELECT-ORDER BY)

    SQL Fundamentals || Oracle SQL语言 统计函数 单字段分组统计(GROUP BY) 多字段分组统计 HAVING子句 控制操作的显示列:基本的SELECT语句 控制行:限定 ...

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

    视频课程:李兴华 Oracle从入门到精通 视频课程学习者:阳光罗诺 视频来源:51CTO学院 整体内容: 统计函数的使用 分组统计查询的实现 对分组的数据过滤 统计函数 在之前我们就学习过一个COU ...

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

    -------------------------------------day3------------ --添加多行数据:------INSERT [INTO] 表名 [(列的列表)] --SEL ...

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

    关于sql 分组统计查询,我们在做报表的时候经常需要用到;今天就在这里整理下; 先附上一段sql代码: if object_id(N'#mytb',N'U') is not null drop tab ...

  7. mysql加强(3)~分组(统计)查询

    一.分组(统计) 查询 1.语法 : select [distinct] *| 分组字段1[别名] [,分组字段2[别名],...] | 统计函数 from 表名 [别名] [where 条件(s)] ...

  8. ORM( ORM查询13种方法3. 单表的双下划线的使用 4. 外键的方法 5. 多对多的方法 ,聚合,分组,F查询,Q查询,事务 )

    必知必会13条 <1> all(): 查询所有结果 <2> get(**kwargs): 返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或 ...

  9. mysql 更新与查询(排序 分组 链接查询)

    UPDATE更新 #每一次数据的更新都需要update UPDATE 命令修改 MySQL 数据表数据的通用 SQL 语法: UPDATE table_name SET field1=new-valu ...

随机推荐

  1. Linux系统升级更新openssh 7.3p1

    放在最前面:鉴于网上爬虫猖獗,博客被盗时有发生,这里需要来个链接,大家请认准来自博客园的Scoter:http://www.cnblogs.com/scoter2008,本文将持续更新 最近绿盟给扫描 ...

  2. 启动rabbitmq web管理后台插件

    安装完rabbitmq server之后,访问http://server_ip:15672/  无法打开网页, 通过netstat -ano |grep 15672 查看此端口号并没有开启 需要启用 ...

  3. REDIS 在电商中的实际应用场景(转)

    1. 各种计数,商品维度计数和用户维度计数 说起电商,肯定离不开商品,而附带商品有各种计数(喜欢数,评论数,鉴定数,浏览数,etc),Redis的命令都是原子性的,你可以轻松地利用INCR,DECR等 ...

  4. SSIS hang with unhandle exception

    如果你的packages在执行的过程中有没有被捕获到的异常,则sqldumper会跳出来获取这些异常信息输出,存在下面的目录中: C:\Program Files\Microsoft SQL Serv ...

  5. pyhon之Tkinter实例化学习

    Tkinter模块("Tk 接口")是Python的标准Tk GUI工具包的接口,位Python的内置模块,直接import tkinter即可使用. 作为实践, 用Tkinter ...

  6. uva 699 the falling leaves——yhx

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAA3QAAAMsCAIAAACTL3d2AAAgAElEQVR4nOx9y7GuPA4tKRADk/92T8 ...

  7. 深入理解maven及应用--转

    (一):生命周期和插件 在项目里用了快一年的maven了,最近突然发现maven项目在eclipse中build时非常慢,因为经常用clean install命令来build项目,也没有管那么多,但最 ...

  8. Android学习----自适应国际化语言

    [前言] 自适应的知识与编程无关,关键在于配置文件的修改.自适应的内容包括:语言.屏幕.平台.今天就来说一下如何自适应国际化言. internationalization (国际化)简称:i18n,因 ...

  9. LYK 快跑!(LYK别打我-)(话说LYK是谁)

    LYK 快跑!(run) Time Limit:5000ms Memory Limit:64MB 题目描述 LYK 陷进了一个迷宫! 这个迷宫是网格图形状的. LYK 一开始在(1,1)位置, 出口在 ...

  10. NGUI国际化 多语言

    相关组件 NGUI的本地化操作相关的组件 Localization UILocalize Language Selection 主要部分 在需要本地化的UILabel上绑定UILocalize,填写K ...