Linq入门演练---(1)基本用法-分组,排序,内连接
这一节大家共同学习下LINQ的基本用法,主要包括LINQ的分组,排序,和内外连接。
1.分组
基本语法: group element by key
element 表示查询结果返回的元素,key表示分组条件。group子句返回的类型为IGrouping<TKey,TElement>的查询结果。
IGrouping<TKey,TElement>可以看成一个hashtable内部嵌套一个list列表的数据结果. 其中TElement就是一个list
我们看下面的一个事例,下面这个实例演示根据性别对用户进行分组
代码
- publicclass User
- {
- public User(string userName,string sex,int age)
- {
- UserName = userName;
- Sex = sex;
- Age = age;
- }
- publicstring UserName
- {
- get;
- set;
- }
- publicstring Sex
- {
- get;
- set;
- }
- publicint Age
- {
- get;
- set;
- }
- }
public class User{public User(string userName,string sex,int age){UserName = userName;Sex = sex;Age = age;}public string UserName{get;set;}public string Sex{get;set;}public int Age{get;set;}}
- privatevoid button1_Click(object sender, EventArgs e)
- {
- User[] users = {
- new User("刘德华","男",40),
- new User("张学友","男",30),
- new User("张曼玉","女",35),
- new User("杨幂","女",53)
- };
- var query1 =
- from var1 in users
- group var1 by var1.Sex;
- string str = "";
- foreach (var item in query1)
- {
- str += item.Key + "\r\n";
- foreach (var user in item)
- {
- str += user.UserName + "--" + user.Sex + "--" + user.Age.ToString() + "\r\n";
- }
- }
- textBox1.Text = str;
- }
private void button1_Click(object sender, EventArgs e){User[] users = { new User("刘德华","男",40),new User("张学友","男",30),new User("张曼玉","女",35),new User("杨幂","女",53)};var query1 =from var1 in usersgroup var1 by var1.Sex;string str = "";foreach (var item in query1){str += item.Key + "\r\n";foreach (var user in item){str += user.UserName + "--" + user.Sex + "--" + user.Age.ToString() + "\r\n";}}textBox1.Text = str;}
效果图
以上是简单的分组,如果需要对分组结果进行排序,需要把分组结果保存到一个临时变量中
语法: group element by key into temp
以下是按年龄从小到大的排序:
代码
- User[] users = {
- new User("刘德华","男",40),
- new User("张学友","男",30),
- new User("张曼玉","女",35),
- new User("杨幂","女",53)
- };
- var query1 =
- from var1 in users
- group var1 by var1.Age into temp
- orderby temp.Key descending
- select temp;
- string str = "";
- foreach (var item in query1)
- {
- str += item.Key + "\r\n";
- foreach (var user in item)
- {
- str += user.UserName + "--" + user.Sex + "--" + user.Age.ToString() + "\r\n";
- }
- }
- textBox1.Text = str;
User[] users = { new User("刘德华","男",40),new User("张学友","男",30),new User("张曼玉","女",35),new User("杨幂","女",53)};var query1 =from var1 in usersgroup var1 by var1.Age into temporderby temp.Key descendingselect temp;string str = "";foreach (var item in query1){str += item.Key + "\r\n";foreach (var user in item){str += user.UserName + "--" + user.Sex + "--" + user.Age.ToString() + "\r\n";}}textBox1.Text = str;
效果图
2.排序
在linq中排序使用orderby
语法 orderby elment descending||ascending
ascending表示升序,descending表示降序
下面这个DEMO演示按年龄从大到小排序
代码:
- User[] users = {
- new User("刘德华","男",40),
- new User("张学友","男",30),
- new User("张曼玉","女",35),
- new User("杨幂","女",53)
- };
- var query1 =
- from var1 in users
- orderby var1.Age descending
- select var1;
- string str = "";
- foreach (var item in query1)
- {
- str += item.UserName + "--" + item.Age + "\r\n";
- }
- textBox1.Text = str;
User[] users = { new User("刘德华","男",40),new User("张学友","男",30),new User("张曼玉","女",35),new User("杨幂","女",53)};var query1 =from var1 in usersorderby var1.Age descendingselect var1;string str = "";foreach (var item in query1){str += item.UserName + "--" + item.Age + "\r\n";}textBox1.Text = str;
效果图
3.内连接
内连接查询就是根据一定的条件查询两个数据源中都存在的元素
语法: join elment in datasource on re1 equals re2
以下代码查找两个数组中都存在的元素。
代码:
- privatevoid button3_Click(object sender, EventArgs e)
- {
- //查询两个数组中都存在的元素
- int[] arrOne = { 10,20,30,6,8};
- int[] arrTwo = { 10,4,6,8,90,3};
- var query = from re1 in arrOne
- join re2 in arrTwo on re1 equals re2
- select new { re1 = re1, re2 = re2 };
- foreach (var item in query)
- {
- Console.WriteLine(item);
- }
- }
private void button3_Click(object sender, EventArgs e){//查询两个数组中都存在的元素int[] arrOne = { 10,20,30,6,8};int[] arrTwo = { 10,4,6,8,90,3};var query = from re1 in arrOnejoin re2 in arrTwo on re1 equals re2select new { re1 = re1, re2 = re2 };foreach (var item in query){Console.WriteLine(item);}}
查询结果:
- { re1 = 10, re2 = 10 }
- { re1 = 6, re2 = 6 }
- { re1 = 8, re2 = 8 }
{ re1 = 10, re2 = 10 }
{ re1 = 6, re2 = 6 }
{ re1 = 8, re2 = 8 }
4.左连接
左连接和SQL中的左连接类似,返回第一个结果集中的所有元素。
下面的代码演示使用左连接,左连接要用到defaultempty()方法,此方法从列表中获取指定元素,如果列表为空,返回默认值
代码
- privatevoid button4_Click(object sender, EventArgs e)
- {
- //左连接
- int[] arrOne = { 10, 20, 30, 6, 8 };
- int[] arrTwo = { 10, 4, 6, 8, 90, 3 };
- var query = from re1 in arrOne
- join re2 in arrTwo on re1 equals re2 into temgrp
- from grp in temgrp.DefaultIfEmpty()
- select new { re1 = re1, re2 = grp };
- foreach (var item in query)
- {
- Console.WriteLine(item);
- }
- }
private void button4_Click(object sender, EventArgs e){//左连接int[] arrOne = { 10, 20, 30, 6, 8 };int[] arrTwo = { 10, 4, 6, 8, 90, 3 };var query = from re1 in arrOnejoin re2 in arrTwo on re1 equals re2 into temgrpfrom grp in temgrp.DefaultIfEmpty()select new { re1 = re1, re2 = grp };foreach (var item in query){Console.WriteLine(item);}}
查询结果
- { re1 = 10, re2 = 10 }
- { re1 = 20, re2 = 0 }
- { re1 = 30, re2 = 0 }
- { re1 = 6, re2 = 6 }
- { re1 = 8, re2 = 8 }
Linq入门演练---(1)基本用法-分组,排序,内连接相关推荐
- SQL中的left outer join,inner join,right outer join用法 (左右内连接)
SQL语句中的left outer join,inner join,right outer join用法 left outer join=left join , right outer join= ...
- limit用法,左右内连接的写法和区别
在项目里经常会写到数据库的展示等一些功能,必不可少的一个组成就是分页. 在数据展示里,如何查看第几页的数据?如何定义几条数据算一页?这篇文章着重来写limit的用法. limit是限制的意思. sql ...
- row_number() over (partition by....order by...)用法 分组排序
row_number() OVER (PARTITION BY COL1 ORDER BY COL2) 表示根据COL1分组,在分组内部根据 COL2排序,而此函数计算的值就表示每组内部排序后的顺序编 ...
- SQL入门之第十讲——INNER JOIN 内连接
在实际的业务当中,往往需要多张表连接查询,这就会涉及到JOIN 连接 1. JOIN 连接的类型 INNER JOIN :内连接, 可以只写JOIN ,只有连接的两个表中,都存在连接标准的数据才会保留 ...
- ROW_NUMBER() OVER()函数用法详解 (分组排序 例子多)
ROW_NUMBER() OVER()函数用法详解 (分组排序 例子多) https://blog.csdn.net/qq_25221835/article/details/82762416 post ...
- oracle分类函数总结,oracle中分组排序函数用法
项目开发中,我们有时会碰到需要分组排序来解决问题的情况,如:1.要求取出按field1分组后,并在每组中按照field2排序:2.亦或更加要求取出1中已经分组排序好的前多少行的数据 这里通过一张表的示 ...
- oracle rownum用法排序,利用rownum分组排序去重
需求:SQL> select fyear,fseason,fsale from t_test order by fyear,fseason; FYEAR FSEASON FSAL ...
- oracle中按数字大小排序函数,oracle中分组排序函数用法
项目开发中,我们有时会碰到需要分组排序来解决问题的情况,如: 1.要求取出按field1分组后,并在每组中按照field2排序:2.亦或更加要求取出1中已经分组排序好的前多少行的数据 这里通过一张表的 ...
- oracle求和分组排序,oracle中分组排序函数用法 - 转
项目开发中,我们有时会碰到需要分组排序来解决问题的情况,如:1.要求取出按field1分组后,并在每组中按照field2排序:2.亦或更加要求取出1中已经分组排序好的前多少行的数据 这里通过一张表的示 ...
最新文章
- Python在linux服务器上解压,python3传文件到linux服务器然后解压
- 设计模式——门面(外观)模式
- 自动登录126邮箱的脚本
- ST_Curve --- 一个专业的曲线绘制控件
- 大数据集群问题排查:时间不同步导致hbase regionserver只启动了部分节点的进程
- 如何在ABAP Netweaver和CloudFoundry里记录并查看日志 1
- 字节跳动python面试_【字节跳动Python面试】生平遇到最好的面试体验-看准网
- 最小路径和--p64--动态规划
- 架构师之路(39)---IoC框架
- 前端裁剪头像框_不懂技术和工艺,当心高功率激光焊接头“热”过头
- ajax卡死new formdata(),使用FormData和jQuery上传Ajax大文件无法发布数据
- 微信电脑版真的要来了 微信Windows版客户端1.0 Alpha推出
- 将有道云词典单词本导入到墨墨背单词
- 如何利用Grasshopper中的C#制作一个简单的Tekla18.1直梁创建电池
- 商业智能BI推动制造业智能化转型
- 【First-order Methods】 5 Smoothness and Strong Convexity
- PPT转图片解决方案
- vmware装的ubuntu的界面怎么全屏?
- [Swift]UIButton文本添加下划线
- oracle bom递归查询,求多阶BOM查询代码