这一节大家共同学习下LINQ的基本用法,主要包括LINQ的分组,排序,和内外连接。

1.分组

基本语法:  group element by key

element 表示查询结果返回的元素,key表示分组条件。group子句返回的类型为IGrouping<TKey,TElement>的查询结果。

IGrouping<TKey,TElement>可以看成一个hashtable内部嵌套一个list列表的数据结果. 其中TElement就是一个list

我们看下面的一个事例,下面这个实例演示根据性别对用户进行分组

代码

[csharp] view plaincopyprint?
  1. publicclass User
  2. {
  3. public User(string userName,string sex,int age)
  4. {
  5. UserName = userName;
  6. Sex = sex;
  7. Age = age;
  8. }
  9. publicstring UserName
  10. {
  11. get;
  12. set;
  13. }
  14. publicstring Sex
  15. {
  16. get;
  17. set;
  18. }
  19. publicint Age
  20. {
  21. get;
  22. set;
  23. }
  24. }
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;}}
[csharp] view plaincopyprint?
  1. privatevoid button1_Click(object sender, EventArgs e)
  2. {
  3. User[] users = {
  4. new User("刘德华","男",40),
  5. new User("张学友","男",30),
  6. new User("张曼玉","女",35),
  7. new User("杨幂","女",53)
  8. };
  9. var query1 =
  10. from var1 in users
  11. group var1 by var1.Sex;
  12. string str = "";
  13. foreach (var item in query1)
  14. {
  15. str += item.Key + "\r\n";
  16. foreach (var user in item)
  17. {
  18. str += user.UserName + "--" + user.Sex + "--" + user.Age.ToString() + "\r\n";
  19. }
  20. }
  21. textBox1.Text = str;
  22. }
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

以下是按年龄从小到大的排序:

代码

[csharp] view plaincopyprint?
  1. User[] users = {
  2. new User("刘德华","男",40),
  3. new User("张学友","男",30),
  4. new User("张曼玉","女",35),
  5. new User("杨幂","女",53)
  6. };
  7. var query1 =
  8. from var1 in users
  9. group var1 by var1.Age into temp
  10. orderby temp.Key descending
  11. select temp;
  12. string str = "";
  13. foreach (var item in query1)
  14. {
  15. str += item.Key + "\r\n";
  16. foreach (var user in item)
  17. {
  18. str += user.UserName + "--" + user.Sex + "--" + user.Age.ToString() + "\r\n";
  19. }
  20. }
  21. 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演示按年龄从大到小排序

代码:

[csharp] view plaincopyprint?
  1. User[] users = {
  2. new User("刘德华","男",40),
  3. new User("张学友","男",30),
  4. new User("张曼玉","女",35),
  5. new User("杨幂","女",53)
  6. };
  7. var query1 =
  8. from var1 in users
  9. orderby var1.Age descending
  10. select var1;
  11. string str = "";
  12. foreach (var item in query1)
  13. {
  14. str += item.UserName + "--" + item.Age + "\r\n";
  15. }
  16. 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

以下代码查找两个数组中都存在的元素。

代码:

[csharp] view plaincopyprint?
  1. privatevoid button3_Click(object sender, EventArgs e)
  2. {
  3. //查询两个数组中都存在的元素
  4. int[] arrOne = { 10,20,30,6,8};
  5. int[] arrTwo = { 10,4,6,8,90,3};
  6. var query = from re1 in arrOne
  7. join re2 in arrTwo on re1 equals re2
  8. select new { re1 = re1, re2 = re2 };
  9. foreach (var item in query)
  10. {
  11. Console.WriteLine(item);
  12. }
  13. }
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);}}

查询结果:

[csharp] view plaincopyprint?
  1. { re1 = 10, re2 = 10 }
  2. { re1 = 6, re2 = 6 }
  3. { re1 = 8, re2 = 8 }
{ re1 = 10, re2 = 10 }
{ re1 = 6, re2 = 6 }
{ re1 = 8, re2 = 8 }

4.左连接

左连接和SQL中的左连接类似,返回第一个结果集中的所有元素。

下面的代码演示使用左连接,左连接要用到defaultempty()方法,此方法从列表中获取指定元素,如果列表为空,返回默认值

代码

[csharp] view plaincopyprint?
  1. privatevoid button4_Click(object sender, EventArgs e)
  2. {
  3. //左连接
  4. int[] arrOne = { 10, 20, 30, 6, 8 };
  5. int[] arrTwo = { 10, 4, 6, 8, 90, 3 };
  6. var query = from re1 in arrOne
  7. join re2 in arrTwo on re1 equals re2 into temgrp
  8. from grp in temgrp.DefaultIfEmpty()
  9. select new { re1 = re1, re2 = grp };
  10. foreach (var item in query)
  11. {
  12. Console.WriteLine(item);
  13. }
  14. }
  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);}}

查询结果

[csharp] view plaincopyprint?
  1. { re1 = 10, re2 = 10 }
  2. { re1 = 20, re2 = 0 }
  3. { re1 = 30, re2 = 0 }
  4. { re1 = 6, re2 = 6 }
  5. { re1 = 8, re2 = 8 }

Linq入门演练---(1)基本用法-分组,排序,内连接相关推荐

  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= ...

  2. limit用法,左右内连接的写法和区别

    在项目里经常会写到数据库的展示等一些功能,必不可少的一个组成就是分页. 在数据展示里,如何查看第几页的数据?如何定义几条数据算一页?这篇文章着重来写limit的用法. limit是限制的意思. sql ...

  3. row_number() over (partition by....order by...)用法 分组排序

    row_number() OVER (PARTITION BY COL1 ORDER BY COL2) 表示根据COL1分组,在分组内部根据 COL2排序,而此函数计算的值就表示每组内部排序后的顺序编 ...

  4. SQL入门之第十讲——INNER JOIN 内连接

    在实际的业务当中,往往需要多张表连接查询,这就会涉及到JOIN 连接 1. JOIN 连接的类型 INNER JOIN :内连接, 可以只写JOIN ,只有连接的两个表中,都存在连接标准的数据才会保留 ...

  5. ROW_NUMBER() OVER()函数用法详解 (分组排序 例子多)

    ROW_NUMBER() OVER()函数用法详解 (分组排序 例子多) https://blog.csdn.net/qq_25221835/article/details/82762416 post ...

  6. oracle分类函数总结,oracle中分组排序函数用法

    项目开发中,我们有时会碰到需要分组排序来解决问题的情况,如:1.要求取出按field1分组后,并在每组中按照field2排序:2.亦或更加要求取出1中已经分组排序好的前多少行的数据 这里通过一张表的示 ...

  7. oracle rownum用法排序,利用rownum分组排序去重

    需求:SQL> select fyear,fseason,fsale from t_test order by fyear,fseason; FYEAR    FSEASON      FSAL ...

  8. oracle中按数字大小排序函数,oracle中分组排序函数用法

    项目开发中,我们有时会碰到需要分组排序来解决问题的情况,如: 1.要求取出按field1分组后,并在每组中按照field2排序:2.亦或更加要求取出1中已经分组排序好的前多少行的数据 这里通过一张表的 ...

  9. oracle求和分组排序,oracle中分组排序函数用法 - 转

    项目开发中,我们有时会碰到需要分组排序来解决问题的情况,如:1.要求取出按field1分组后,并在每组中按照field2排序:2.亦或更加要求取出1中已经分组排序好的前多少行的数据 这里通过一张表的示 ...

最新文章

  1. Python在linux服务器上解压,python3传文件到linux服务器然后解压
  2. 设计模式——门面(外观)模式
  3. 自动登录126邮箱的脚本
  4. ST_Curve --- 一个专业的曲线绘制控件
  5. 大数据集群问题排查:时间不同步导致hbase regionserver只启动了部分节点的进程
  6. 如何在ABAP Netweaver和CloudFoundry里记录并查看日志 1
  7. 字节跳动python面试_【字节跳动Python面试】生平遇到最好的面试体验-看准网
  8. 最小路径和--p64--动态规划
  9. 架构师之路(39)---IoC框架
  10. 前端裁剪头像框_不懂技术和工艺,当心高功率激光焊接头“热”过头
  11. ajax卡死new formdata(),使用FormData和jQuery上传Ajax大文件无法发布数据
  12. 微信电脑版真的要来了 微信Windows版客户端1.0 Alpha推出
  13. 将有道云词典单词本导入到墨墨背单词
  14. 如何利用Grasshopper中的C#制作一个简单的Tekla18.1直梁创建电池
  15. 商业智能BI推动制造业智能化转型
  16. 【First-order Methods】 5 Smoothness and Strong Convexity
  17. PPT转图片解决方案
  18. vmware装的ubuntu的界面怎么全屏?
  19. [Swift]UIButton文本添加下划线
  20. oracle bom递归查询,求多阶BOM查询代码

热门文章

  1. Java 枚举:实现接口
  2. 从 +new Date 说起,Javascript的一元操作符
  3. Android 小项目之--Mini音乐播放器【简单版】(附源码)
  4. VS2015中DataGridView的DataGridViewComBoboxCell列值无效及数据绑定错误的解决方法
  5. SharePoint服务器修改域和机器名
  6. Linux下mysql 5.x得到root密码后的另外一种利用方式
  7. thinkphp中URL传参数的几种方式
  8. 多进程实现生产者消费者
  9. 配置IISExpress允许外部访问
  10. Linux解压rar、zip、war、tar文件