LINQ入门教程之各种标准查询操作符(一)
好久之前就想系统的学习下LINQ,好久之前……
本篇文章主要介绍LINQ等的标准查询操作符,内容取自《LINQ高级编程》,后续还会介绍LINQ to XML ,LINQ to SQL。
进入正题
(一)先介绍下标准查询操作符的概念
它是一系列方法的集合,如常见的Select 、Where、OrderBy等,这些方法作用于序列(集合)之上,序列是一个实现了IEnumerable<T>接口或IQueryable<T>接口的类型的对象。
IEnumerable和IQueryable的一个区别是:IEnumerable接口提供了向前遍历的功能。它不具备在各个数据项之间移动(向前移动除外)的能力。IQueryalbe可以使查询操作更具灵活性。
通俗的讲查询操作符是用好linq的基本,就像砍材要用的刀一样……
(二)另外再说下 查询语法和方法语法的概念
查询语法 即用查询表达式来编写查询。 如代码:
int[] data={,,,};
IEnumerable<int> query = from da in data where da > select da;
那方法语法呢 如代码:
int[] data={,,,};
IEnumerable<int> query2 = data.Select(o => o).Where(d => d > );
LINQ在编译的时候,查询语法将会转为方法语法。相对而言,查询语法更容易阅读、理解和维护
(三)各种查询操作符汇总列表
| 标准查询操作符 (方法语法) | 查询表达式(查询语法) |
| All(Of T) | N/A |
| Any | N/A |
| Average | N/A |
| Cast(Of T) | An explicit range of variables |
| Count | N/A |
| Distinct | N/A |
| GroupBy | group by |
| GroupJoin | join…in…on…into |
| Join | join…in…on…equals… |
| LongCount | N/A |
| Max | N/A |
| Min | N/A |
| OrderBy | order by |
| OrderByDescending | order by descending |
| Select | select |
| SelectMany | Multiple from clauses |
| Skip | N/A |
| SkipWhile | N/A |
| Sum | N/A |
| Take | N/A |
| TakeWhile | N/A |
| ThenBy | order by |
| ThenByDescending | order by descending |
| Where | where |
备注:N/A (Not Applicable 不适用的)
(四) 下面主要通过代码来讲解各个标准查询操作符。
1. 投影操作符 (Select SelectMany)
#region 投影操作符 将序列中的元素转换为一个由开发人员定义的形式的操作
/// <summary>
/// 对单个序列或集合中的值进行投影
/// </summary>
static void SelectFunction()
{
DataContext contexts = new DataContext("Initial Catalog=AdventureWorks; Integrated Security=true");
Table<Contact> contacts = contexts.GetTable<Contact>();
//查询语法
var query = from c in contacts where c.FirstName == "gong" select new { c.FirstName };
//方法语法
query = contacts.Select(o => new { o.FirstName }).Where(c => c.FirstName == "gong");
foreach (var item in query)
{
Console.WriteLine(item.FirstName);
}
}
//output:
//Gong
//Gong
class name{ public List<string> pets; public string FirstName;}
/// <summary>
/// selectMany 提供了将多个from子句组合起来的功能,它将每个对象的结果合并成单个序列
/// </summary>
static void SelectManyFunction( )
{
//List<name> list =new List<name>() {
name[] list =new name[] {
new name{ FirstName="Gwt",pets=new List<string>{"TEST"} } ,
new name{ FirstName="Gwt1",pets=new List<string>{"TEST4","Test41"} },
};
//将所有List<string> 合并
IEnumerable<string> query = list.SelectMany(own => own.pets);
foreach (string item in query)
{
Console.Write(item +" ");
}
Console.WriteLine("");
//下面这个循环等于上面的seletmany方法
var query2 = list.Select(own => own.pets);
foreach (var item in query2)
{
foreach (var item2 in item)
{
Console.Write(item2+" ");
}
}
}
//output:
// TEST TEST4 TEST41
// TEST TEST4 TEST41
2. 限制操作符 (Where)
#region 限制操作符
/// <summary>
/// where操作符不启动查询的执行,当开始对对象进行枚举时查询才开始执行
/// </summary>
static void WhereFunction()
{
int[] numbers = { ,,,,,};
IEnumerable<int> query = numbers.Select(o => o).Where(o => o > );
foreach (int item in query)
{
Console.Write(item+" ");
}
}
//output;
//4 5 6
#endregion
3. 排序操作符 (OrderBy OrderByDescending ThenBy ThenByDescending Reverse)
#region 排序操作符
/// <summary>
/// OrderBy/OrderByDescending 对应提供了按照升序/降序的方式对结果进行排序的功能
/// ThenBy/ThenByDescending 实现按照次关键字对序列进行升序/降序排列
/// </summary>
static void OrderByFunction()
{
DataContext context = new DataContext(StaticData.ConnectSql);
Table<Contact> contacts = context.GetTable<Contact>( );
IEnumerable<Contact> query = contacts.Select(o => o).OrderBy(o => o.FirstName).ThenBy(o => o.LastName); foreach (Contact item in query)
{
Console.WriteLine(item.FirstName + " " + item.LastName);
}
Console.WriteLine();
query = contacts.Select(o => o).OrderByDescending(o => o.FirstName).ThenByDescending(o => o.LastName);
foreach (Contact item in query)
{
Console.WriteLine(item.FirstName + " " + item.LastName);
}
}
//output:
//Gong tao
//Gong taos
//gong2 tao2
//gong3 tao3
//gong4 tao4
//gong5 tao5
//
//gong5 tao5
//gong4 tao4
//gong3 tao3
//gong2 tao2
//Gong taos
//Gong tao
/// <summary>
/// Reverse 把数据源的数据按相反的顺序返回
/// </summary>
static void ReverseFunction()
{
int[] numbers = { ,,,,};
IEnumerable<int> query = numbers.Reverse();
foreach (int item in query)
{
Console.Write(item+" ");
}
}
//output:
//5 4 3 2 1
#endregion
4. 联接操作符 (Join GroupJoin)
#region 联接操作符
/// <summary>
/// join 相当于T-SQL中的inner join
/// </summary>
static void JoinFunction()
{
DataContext context = new DataContext(StaticData.ConnectSql);
Table<Contact> contact = context.GetTable<Contact>();
Table<Employee> employee = context.GetTable<Employee>();
//方法语法
var query = contact.Join(employee, con => con.ContactID, emp => emp.ContactID,
(con, emp) => new { ContactName = con.FirstName, emp })
.Where(con=>con.ContactName=="gong2");
//查询语法
query = from con in contact
join emp in employee on con.ContactID equals emp.ContactID
where con.FirstName=="gong2"
select new { ContactName = con.FirstName, emp } ;
foreach (var item in query)
{
Console.WriteLine(item.ContactName + " " + item.emp.EmployeeID);
}
}
//output:
//gong2 23
//gong2 24
//gong2 25
//gong2 26
class Team
{
public string TeamName;
}
class Rider
{
public string Name;
public string TeamName;
}
/// <summary>
/// GroupJoin
/// </summary>
static void GroupJoinFunction()
{
List<Team> teams = new List<Team>{new Team{ TeamName="t1"}
,new Team{TeamName="t2"}
,new Team{TeamName="t3"}
};
List<Rider> riders = new List<Rider> {
new Rider{Name="r1",TeamName="t1"},
new Rider{Name="r2",TeamName="t1"},
new Rider{Name="r3",TeamName="t2"},
new Rider{Name="r4",TeamName="t2"},
new Rider{Name="r5",TeamName="t3"},
new Rider{Name="r6",TeamName="t3"},
};
//方法语法
var query = teams.GroupJoin(riders, t => t.TeamName, r => r.TeamName,
(t, r) => new { teamname = t.TeamName, ridernames = r.Select(o => o.Name) });
foreach (var item in query)
{
Console.WriteLine(item.teamname);
foreach (var item2 in item.ridernames)
{
Console.WriteLine(" "+item2);
}
}
}
//output:
//t1
// r1
// r2
//t2
// r3
// r4
//t3
// r5
// r6
#endregion
5. 分组操作符 (GroupBy)
#region 分组操作符 根据一个特定的值(选择器) 将序列中的值或元素进行分组
/// <summary>
///
/// </summary>
static void GroupByFunction()
{
DataContext context = new DataContext(StaticData.ConnectSql);
Table<SalesOrderHeader> orders = context.GetTable<SalesOrderHeader>();
//按照每个销售人员对订单进行分组
var query = orders.Where(o => o.SalesPersonID > ).GroupBy(order => order.SalesPersonID, order => order.CustomerID); foreach (var item in query)
{
Console.WriteLine(item.Key);
foreach (var item2 in item)
{
Console.WriteLine(" " + item2);
}
}
}
#endregion
6. 串联操作符 (Concat)
#region 串联操作符
/// <summary>
/// 串联操作符 Concat 【将两个集合合并成一个集合】
/// </summary>
static void ConcatFunction( )
{
DataContext context = new DataContext(StaticData.ConnectSql);
Table<Contact> contacts = context.GetTable<Contact>( );
Table<SalesOrderHeader> orders = context.GetTable<SalesOrderHeader>();
//将Contact表的Firstname和SalesOrderHeader的CustomerID串联起来
var query = contacts.Select(con => con.FirstName).Concat(orders.Select(order => order.CustomerID.ToString()));
foreach (var item in query)
{
Console.WriteLine(item.ToString());
}
}
#endregion
动动您的手指,点下支持,您的支持是我最大动力!
LINQ入门教程之各种标准查询操作符(一)的更多相关文章
- LINQ入门教程之各种标准查询操作符(二)
续上篇LINQ入门教程之各种标准查询操作符(一) LINQ入门教程之各种标准查询操作符(二) 7. 聚合操作符 8. 集合操作符 9. 生成操作符 #region 生成操作符 即从现有序列的值中 ...
- LINQ标准查询操作符详解(转)
一. 关于LINQ LINQ 英文全称是“Language-Integrated Query”,中文为“语言集成查询”,它是微软首席架构师.Delphi 之父和C# 之父——Anders ...
- Linq to BBJECT之非延时标准查询操作符
非延时标准查询操作符是指不具备延时查询特性的标准查询操作符,这些操作符一般用于辅助延时标准查询操作符使用. 1.ToArray操作符 ToArray操作符用于将一个输入序列转换成一个数组. 方法原型: ...
- Linq to OBJECT延时标准查询操作符
1.Where 操作符用于限定输入集合中的元素,将符合条件的元素组织声称一个序列结果.2.Select 操作符用于根据输入序列中的元素创建相应的输出序列中的元素,输出序列中的元素类型可以与输入序列中 ...
- Linq 标准查询操作符三
本文介绍了LINQ标准查询操作符.没有这些操作符,LINQ就不会存在.本文为理解这些操作符的功能提供了很好的基础.了解它们将会很有帮助,因为LINQ的各种Provider都是基于这些操作符来完成各自丰 ...
- LINQ 标准查询操作符
本文介绍了LINQ标准查询操作符.没有这些操作符,LINQ就不会存在.本文为理解这些操作符的功能提供了很好的基础.了解它们将会很有帮助,因为LINQ的各种Provider都是基于这些操作符来完成各自丰 ...
- Linq to Object 延迟标准查询操作符
1.Where 操作符用于限定输入集合中的元素,将符合条件的元素组织声称一个序列结果.2.Select 操作符用于根据输入序列中的元素创建相应的输出序列中的元素,输出序列中的元素类型可以与输入序列中 ...
- Linq to Object之非延迟标准查询操作符
非延时标准查询操作符是指不具备延时查询特性的标准查询操作符,这些操作符一般用于辅助延时标准查询操作符使用. 1.ToArray操作符 ToArray操作符用于将一个输入序列转换成一个数组. 方法原型: ...
- Elasticsearch入门教程(五):Elasticsearch查询(一)
原文:Elasticsearch入门教程(五):Elasticsearch查询(一) 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:h ...
随机推荐
- os.path等os模块函数
os.path.abspath(path) #返回绝对路径 os.path.basename(path) #返回文件名 os.path.commonprefix(list) #返回list(多个路径) ...
- canvas里调用getImageData的报security的问题
canvas元素支持绘制任意图片元素: var ctx = document.getElementById("canvas").getContext("2d") ...
- Codeforces768B Code For 1 2017-02-21 22:17 95人阅读 评论(0) 收藏
B. Code For 1 time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...
- SDJZUOJ迷宫问题
题目描述 小明置身于一个迷宫,请你帮小明找出从起点到终点的最短路程. 小明只能向上下左右四个方向移动. 输入格式 输入包含多组测试数据.输入的第一行是一个整数T,表示有T组测试数据. 每组输入的第一行 ...
- 13、容器之间的link
很多时候我们的业务分为前台和后台,例如:"前台的代码需要连接数据库进行数据操作":但是在写代码的时候我们并不知道后台数据库的地址是什么,所以我们可以docker通过固定的名字来 ...
- 18-10-30 Scrum Meeting 2
目录 站立式会议 工作记录 昨天完成的工作 1 主要完成了单词简单释义浏览和单词详细释义浏览的功能 并且已经测试和上传eolinker 2 3 主要搭建起爬虫的框架平台,并且测试了py连接服务器的功能 ...
- FORM 错误:此责任无可用函数。 更改责任或与您的系统管理员联系。
错误:此责任无可用函数. 更改责任或与您的系统管理员联系. 2014-07-02 12:20:47 分类: Oracle Symptom 访问Help->Diagnostics->Exam ...
- Mysql部署
1. 下载 Mysql 版本为: mysql-5.6.43-linux-glibc2.12-x86_64.tar.gz (注意:下载二进制文件)  存放位置: /usr/local 2. 检查机器上 ...
- 【分分钟内搭建一个带用户系统的博客程序(一)用户系统】asp.net core的Identity真香,EF真香!
不用不知道,一用香到爆. 老哥是个屌丝前端,但也想写点web应用耍一耍.之前弄过了NodeJs,也弄过JAVA,最近由于写游戏的原因用C#,索性上手一波asp.net core. 这篇博客记录的是,如 ...
- 自定义 Asp.Net SessionID 获取方式
新建类 CustomSessionIDManager public class CustomSessionIDManager : SessionIDManager, ISessionIDManager ...