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

1.分组

基本语法:  group element by key

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

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

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

代码

  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;
}
}
  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 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; }

效果图

以上是简单的分组,如果需要对分组结果进行排序,需要把分组结果保存到一个临时变量中

语法: group element by key into  temp

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

代码

  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 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;

效果图

2.排序

在linq中排序使用orderby

语法 orderby elment  descending||ascending

ascending表示升序,descending表示降序

下面这个DEMO演示按年龄从大到小排序

代码:

  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 users
orderby var1.Age descending
select 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

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

代码:

  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 arrOne
join re2 in arrTwo on re1 equals re2
select new { re1 = re1, re2 = re2 }; foreach (var item in query)
{
Console.WriteLine(item);
} }

查询结果:

  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()方法,此方法从列表中获取指定元素,如果列表为空,返回默认值

代码

  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 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);
}
}

查询结果

  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. row_number() over (partition by....order by...)用法 分组排序

    row_number() over (partition by....order by...)用法 分组排序 row_number() OVER (PARTITION BY COL1 ORDER BY ...

  2. Linq入门演练---(2)lambda表达式

    今天大家一同学习下lambda表达式, lambda表达式使用起来更方便, lambda表达式其实是一个匿名函数,使用的运算符为=> 语法: (参数)=>表达式 如果只有一个参数,可以不使 ...

  3. oracle中分组排序函数用法 - 转

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

  4. ROW_NUMBER() OVER()函数用法;(分组,排序),partition by

    转载:https://www.cnblogs.com/alsf/p/6344197.html 1.row_number() over()排序功能: (1) row_number() over()分组排 ...

  5. ROW_NUMBER() OVER()函数用法;(分组,排序),partition by (转)

    1.row_number() over()排序功能: (1) row_number() over()分组排序功能: 在使用 row_number() over()函数时候,over()里头的分组以及排 ...

  6. Linq之旅:Linq入门详解(Linq to Objects)

    示例代码下载:Linq之旅:Linq入门详解(Linq to Objects) 本博文详细介绍 .NET 3.5 中引入的重要功能:Language Integrated Query(LINQ,语言集 ...

  7. .Net进阶系列(4)-Lambda和linq入门(被替换)

    一. Lambda和linq入门 lambda表达式又叫点标记,linq表达式又叫查询表达式,下面有三个简单的案例说明一下二者的基本用法,详细用法会在后续章节中更新. 二. 事例 1. 准备学生信息. ...

  8. LINQ入门教程之各种标准查询操作符(一)

    好久之前就想系统的学习下LINQ,好久之前…… 本篇文章主要介绍LINQ等的标准查询操作符,内容取自<LINQ高级编程>,后续还会介绍LINQ to XML ,LINQ to SQL. L ...

  9. Linq之旅:Linq入门详解(Linq to Objects)【转】

    http://www.cnblogs.com/heyuquan/p/Linq-to-Objects.html Linq之旅:Linq入门详解(Linq to Objects) 示例代码下载:Linq之 ...

随机推荐

  1. 隐藏快捷方式扩展名(.lnk)

    自从装了Windows 7操作系统以后,有一个问题一直困扰着我.当我去掉“目录选项中”的“隐藏已知文件类型的扩展名”选项的“√”之后,桌面上的快捷方式的扩展名也出来了,看上去非常不爽.记得在XP.Vi ...

  2. mod_python模块安装

    两.mod_python 1.性能 使用mod_python的主要优势在于比传统CGI更高的性能. 一个測试,使用在Pentium 1.2GHz的机器上执行Red Hat Linux 7.3.使用4种 ...

  3. Cocos2d-x 3.0final 终结者系列教程01-无论是从cocos2d-x2.x升级到版本cocos2d-x3.x

    诡谲的江湖,易变. 花花世界,车来人往. 最终确定.安家,将Cocos2d-x3.0final相关技术精加工的版本.并推出了博客文章, 不为他人,只为自己. 学习交流QQ群:301954471 --- ...

  4. SQL Server 2008 新增T-SQL 简写语法

    1.定义变量时可以直接赋值 DECLARE @Id int = 5 2.Insert 语句可以一次插入多行数据 INSERT INTO StateList VALUES(@Id, 'WA'), (@I ...

  5. 我学的是设计模式的视频教程——命令模式vs策略模式,唠嗑

    课程视频 命令模式vs策略模式 唠嗑 课程笔记 课程笔记 课程代码 课程代码 新课程火热报名中 课程介绍 版权声明:本文博主原创文章,博客,未经同意不得转载.

  6. RunJS推荐用于个人使用(使用方便JS、css实时预览、编辑、管理等功能)

    RunJS,在线编写.展示html.js.css代码,拥有实时预览.分享.Fork.代码高亮.自己主动完毕等多项特性,提供文件上传.多种登录方式. 地址:http://runjs.cn/ waterm ...

  7. 最艰难的采访IT公司ThoughtWorks代码挑战——FizzBuzzWhizz游戏

    最近的互联网招聘平台拉勾网在五月推出了"最艰难的采访IT公司"码挑战活动,评选出了5个最难面试的IT公司,即:ThoughtWorks.Google.Unisys.Rackspac ...

  8. java线程中的sleep和wait区别

                                                                            面试题:java线程中sleep和wait的区别以及其资 ...

  9. Android学习小Demo(19)利用Loader来实时接收短信

    之前写过一篇文章<Android学习小Demo(13)Android中关于ContentObserver的使用>,在里面利用ContentOberver去监測短信URI内容的变化.我们先来 ...

  10. 前框 (一个)zTree 从数据库树形菜单动态加载

    这些天做动态菜单使用此插件.现在有一个非常广泛的开源框架,最新QUI框架是菜单部分使用这个插件开发,因此,它是非常值获取深入的研究和探讨,通过使用非常丰富的感觉功能,己开发和编写,官网上有非常详尽的A ...