LINQ 查询
概述
事实上,对于LINQ to Objects来说,就是通过为IEnumerable<T>接口定义了一组约50个扩展方式来实现的。
Lambda表达式(拉姆达表达式,Lambda Expression)
匿名方法是在C#2.0中引入的。在C#3.0中,又引入了一种Lambda表达式的语法,可以将它视为匿名方法的等价物,但是语法更为简洁,使得匿名方法的编写变得更加方便。
对于一些扩展方法,它的返回值也是IEnumerable<T>类型,这意味着可以进行一种链式的方法调用,例如list.Where().Orderby().Select().ToList()。 每调用一次,就对列表进行了一次加工。
C#专门为LINQ提供了一种称做查询表达式(Query Expression)的语法,该语法编译后就相当于调用上小节提到的扩展方法。 一个简单的查询表达式如下:
//获得集合,本章将会多次出现
static ProductCollection col = Product.GetSampleCollection();
static void Main(string[] args)
{
var query = from x in col
where x.Category == "Beer"
orderby x.Code
select new { Title = x.Name.ToUpper(), Code = x.Code };
foreach (var item in query)
{
Console.WriteLine("{0}, {1}", item.Code, item.Title);
}
}
在这个查询表达式中,from声明了一个范围变量(range variable)x;in关键字后面是要查询的数据源col;where后面是筛选的依据,为Lambda表达式;最后select投影操作创建了一个新的匿名类型。
与这个查询表达式相对应的链式方法调用是这样:
var query = col
.Where(x => x.Category == "Beer")
.OrderBy(x => x.Code)
.Select(x => new { Title = x.Name.ToUpper(), Code = x.Code });
查询表达式和方法调用可以混合使用,因此,上面的语句也可以这样写:
var query = from x in col.where(x => x.Category == "Beer")
orderby x.Code
select new { Title = x.Name.ToUpper(), Code = x.Code };
一般来说,有这样两种策略:
1)只使用链式方法调用。 但在个别情况下,比如两个集合的连接操作中,使用链式方法调用会使语句变得很复杂,此时应混合使用查询表达式。
2)只使用查询表达式。 但对于某些查询表达式不支持的操作,例如Concat(),混合使用方法调用。
笔者采用的是是第一种策略,因为方法调用更为基础,查询表达式能实现的功能,方法调用全都能实现,而且在大多数情况下使用起来并没有太多不便之处。
-----
1.Where()
2.OfType()
OfType()方法也用于筛选。 与其他运算符不同的是,OfType()定义在IEnumerable上,而不是IEnumerable<T>,它的作用是从非泛型集合中筛选出某一类型的成员并返IEnumerable<T>。
因为OfType()返回的是IEnumerable<T>,所以返回的结果可以继续调用其他的LINQ运算符。
ArrayList list = new ArrayList();
list.Add();
list.Add(DateTime.Now);
list.Add("Have fun");
list.Add("Intresting");
var query = list.OfType<string>().Where(x => x.StartsWidth("Have"));//输出:Have fun
3.Cast()
与OfType()类似,Cast()也定义在IEnumerable上,它用于将非泛型的序列转换为泛型序列IEnumerable<T>。 当某一序列项无法成功转换时,则会抛出异常:
ArrayList list = new ArrayList();
list.Add();
list.Add("Have fun");
var query = list.Cast<int>(); //异常: System.InvalidCastException: 指定的转换无效
4.OrderBy()--OrderByDescending()
var query = col.OrderBy(x => x.Category);
ThenBy()--ThenByDescending()
var query = col.OrderBy(x => x.Category).ThenBy(x => x.Price);
5.Select()
Select()运算符在上面也出现过,它实现了一种投影操作,可以进行对象类型转换。
var query = col.Select((x, index) => new { Title = x.Name, Index = index, Price = x.Price
6.Take()和Skip()
Take()运算符返回了由原序列中前N个元素构成的新序列,N由参数指定。
var query = col.Take(); // 返回前3个元素
Skip()运算符和Take()正好相反,它跳过N个元素,返回后面的所有元素构成的序列:
var query = col.Skip(); // 返回第3个元素之后的所有元素
Skip()和Take()结合起来也可以进行分页,例如,每页显示20条数据,显示第2页的数据,可以这样编写代码:
var query = col.Skip().Take();
7.TakeWhile()和SkipWhile()
TakeWhile()和Where()有点类似,只不过当Where()遇到不符合条件的元素时,会继续查找序列中满足条件的下一个元素,直到序列结束。
而TakeWhile()在遇到不符合条件的元素时会直接返回前面找到的满足条件的元素。
int[] array = { , , , , };
var query = array.TakeWhile(x => x <= ); // 输出1,2
SkipWhile()是TakeWhile()的反操作,它会一直跳过符合条件的元素,直到遇到第一个不符合条件的元素,然后返回该元素之后的所有元素构成的序列。
int[] array = { , , , , };
var query = array.SkipWhile(x => x <= ); // 输出10,4,5
query.ShowConsole();
8.Reverse()
Reverse()用于将序列中的元素逆序排列,例如:
int[] array = { , , };
var query = array.Reverse(); // 输出3,2,1
9.DefaultIfEmpty()
当序列为空时,DefaultIfEmpty()为序列添加一个元素,使用元素的默认值,或者指定元素的值,例如:
int[] array = { };
var query = array.DefaultIfEmpty(); // 输出0
var query2 = array.DefaultIfEmpty(); // 输出100
注意到int是结构类型(值类型),它的默认值为0。 当为类类型时,默认值为null,此时如果不指定默认值则会抛出异常:未将对象引用设置到对象的实例。
ProductCollection col3 = new ProductCollection();
var query = col3.DefaultIfEmpty(); // null
query.ShowConsole();
10.Distinct()
如其名称所表示的,Distinct()运算符用于剔除序列中的重复元素,并返回其余的所有元素。
int[] array = { , , , };
var query = array.Distinct(); // 得到 1,2,3
11.GroupBy()
在LINQ中,GroupBy()的结果可以是一个树形结构,即序列中的元素也是一个序列。
var query = col.GroupBy(x => x.Category);
foreach (var item in query)
{
Console.WriteLine("<{0}>", item.Key);
foreach (var p in item)
{
Console.WriteLine(p.ToString());
}
}
12.Intersect()和Except()
资料
https://www.cnblogs.com/knowledgesea/p/3897665.html
LINQ 查询的更多相关文章
- Entity Framework 6 Recipes 2nd Edition(13-6)译 -> 自动编译的LINQ查询
问题 你想为多次用到的查询提高性能,而且你不想添加额外的编码或配置. 解决方案 假设你有如Figure 13-8 所示的模型 Figure 13-8. A model with an Associat ...
- LinqToDB 源码分析——轻谈Linq查询
LinqToDB框架最大的优势应该是实现了对Linq的支持.如果少了这一个功能相信他在使用上的快感会少了一个层次.本来笔者想要直接讲解LinqToDB框架是如何实现对Linq的支持.写到一半的时候却发 ...
- Linq查询基本操作
摘要:本文介绍Linq查询基本操作(查询关键字) - from 子句 - where 子句 - select子句 - group 子句 - into 子句 - orderby 子句 - join 子句 ...
- C#基础:LINQ 查询函数整理
1.LINQ 函数 1.1.查询结果过滤 :where() Enumerable.Where() 是LINQ 中使用最多的函数,大多数都要针对集合对象进行过滤,因此Where()在LINQ 的操作 ...
- 《Entity Framework 6 Recipes》中文翻译系列 (26) ------ 第五章 加载实体和导航属性之延缓加载关联实体和在别的LINQ查询操作中使用Include()方法
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 5-7 在别的LINQ查询操作中使用Include()方法 问题 你有一个LINQ ...
- Rafy 中的 Linq 查询支持(根据聚合子条件查询聚合父)
为了提高开发者的易用性,Rafy 领域实体框架在很早开始就已经支持使用 Linq 语法来查询实体了.但是只支持了一些简单的.常用的条件查询,支持的力度很有限.特别是遇到对聚合对象的查询时,就不能再使用 ...
- c# Linq查询
c#提供的ling查询极大的遍历了集合的查询过程,且使用简单方便,非常的有用. 下面将分别用简单的例子说明:ling基本查询.延迟查询属性.类型筛选.复合from字句.多级排序.分组查询.联合查询.合 ...
- Linq查询表达式
目录 1. 概述 2. from子句 3. where子句 4. select子句 5. group子句 6. into子句 7. 排序子句 8. let子句 9. join子句 10. 小结 1. ...
- .NET LINQ查询操作中的类型关系
LINQ 查询操作中的类型关系 若要有效编写查询,您应该了解完整的查询操作中的变量类型是如何全部彼此关联的. 如果您了解这些关系,就能够更容易地理解文档中的 LINQ 示例和代码示例. 另外 ...
- .NET LINQ查询语法与方法语法
LINQ 查询语法与方法语法 通过使用 C# 3.0 中引入的声明性查询语法,介绍性 LINQ 文档中的多数查询都被编写为查询表达式. 但是,.NET 公共语言运行时 (CLR) 本身并不具 ...
随机推荐
- 基于skip-gram做推荐系统的想法
一.人工智能之自然语言处理 自然语言处理(Natural Language Processing, NLP),是人工智能的分支科学,意图是使计算机具备处理人类语言的能力. “处理人类语言的能力”要达到 ...
- 第十九次ScrumMeeting博客
第十九次ScrumMeeting博客 本次会议于12月9日(六)22时整在3公寓725房间召开,持续20分钟. 与会人员:刘畅.辛德泰.张安澜.赵奕.方科栋. 1. 每个人的工作(有Issue的内容和 ...
- 团队作业四-WBS练习
我们团队开发的是四则运算,主要面对的用户是小学生.老师及学生家长.经过我们组成员的讨论和结合实际及自身能力,对团队成员分配任务,队长负责全局工作主要负责任务,统一进度,和适量的编码,露哥和阮磊主要负责 ...
- Jquery Cookie操作
// 写入 $.cookie('the_cookie','the_value');// 读取 $.cookie('the_cookie');// 删除 $.cookie('the_cookie',nu ...
- 如何使用js判断视频是否可以成功访问
日常工作中会出现各个公司网络不互通的情况,视频如果采用不互通的地址也无法播放,下面方法提供了检测视频是否可以播放的解决方案: 1.跨域 var video = document.createEleme ...
- group replication && Galera replication
不愧是 Oracle 的 MySQL Community Manager,把对手的 Galera Cluster 讲得一无是处. http://lefred.be/content/group-repl ...
- Mobile Phone Network CodeForces - 1023F(并查集lca+修改环)
题意: 就是有几个点,你掌控了几条路,你的商业对手也掌控了几条路,然后你想让游客都把你的所有路都走完,那么你就有钱了,但你又想挣的钱最多,真是的过分..哈哈 游客肯定要对比一下你的对手的路 看看那个便 ...
- POJ 1182 食物链 (拆点并查集)
食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 78601 Accepted: 23422 Description ...
- Day12-navicat for sqlite 11.1.12 patch 永久使用版
参考来源:http://www.cnblogs.com/yueyue184/p/6407963.html 深深感谢!!! 因为最近需要用这个但是网上都是注册机没有成功注册,所以就自己动手使用ollyd ...
- Traceroute(路由追踪)
Traceroute的实现有两种: 基于UDP实现 traceroute向目的主机发送一系列普通IP数据报,但每个数据报携带一个不可达UDP端口号的UDP报文,TTL分别为1,2,3...TTL过期时 ...