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 ...
随机推荐
- 使用JFinal框架连接数据库,实现注册、登录功能
使用JFinal框架连接数据库,实现注册.登录功能 1.在Eclipse中新建Dynamic Web project项目 2.导入jfinal-2.2-bin-with-src.jar.c3p0-0. ...
- SpringBoot里的一些注解
Spring不仅可以通过xml配置获取*.properties,还可以通过@Value注解的方式来获取,将properties配置文件中的属性值注入到java成员变量. 如果不想每次都写private ...
- ffmpeg只编译h264
./configure --arch=arm --cross-prefix=arm-none-linux-gnueabi- --extra-ldflags=-static --target-os=li ...
- HDU 5120 Intersection (圆的面积交)
题意:给定两个圆环,求两个圆环的面积交. 析:很容易知道,圆环面积交就是,大圆与大圆面积交 - 大圆和小圆面积交 - 小圆和大圆面积交 + 小圆和小圆面积交. 代码如下: #pragma commen ...
- mdk3攻击实例
Authentication Flood,mdk3下参数为a: mdk3 mon0 a –a AP的MAC地址(BSSID) -c来对指定的频道进行攻击 -a固定bssid进行攻击 -s控制发包速率. ...
- RocketMQ 自定义文件路径
一 .1. 修改store路径2. 修改logs路径3. 修改rmq_bk_gc.log路径4. 修改rmq_srv_gc.log路径二 .1. 获取正确的rocketmq 源码2. 地址:https ...
- ios中改变UIImagePickerController页面的button的文字为中文
可以在工程中直接 project-->info-->Localization native development region 赋值为 zh_CN
- SQLServer中数据加密方法
对SQLServer中的数据进行加密,有三种方法, 1. 在程序语言中先对数据进行加密后再把加密后的数据保存在SQLServer数据库中: 2. 利用SQLServer未公开的加密密码函数,在SQ ...
- Angularjs 分页控件
实现效果: 实现步骤: 1.分页页面:page.html,页面多余样式,需要自己去除. <div class="row" ng-show="conf.totalIt ...
- 遇到了IE10不能登录的问题,很早就有解决方案了
1..net 2.0 的程序,请打开项目,打开vs开发环境的工具菜单下的 Package Manager Console ,中文名:程序包管理控制台,在打开的控制台中输入如下命令:Install-P ...