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) 本身并不具 ...
随机推荐
- linux chroot 命令
chroot,即 change root directory (更改 root 目录).在 linux 系统中,系统默认的目录结构都是以 /,即以根 (root) 开始的.而在使用 chroot 之后 ...
- Win环境 Android Studio使用Git 教程 ( 生成SSH key )
Github和码云都提供SSH协议,即用户可以用公钥认证方式连接到码云的SSH服务器.这就需要生成并部署SSH Key.下面就是我生成SSH Key的步骤,希望有所帮助: Git生成SSH key 在 ...
- OpenGL学习(2)——绘制三角形
在创建窗口的基础上,添加代码实现三角形的绘制. 声明和定义变量 在屏幕上绘制一个三角形需要的变量有: 三角形的三个顶点坐标: Vertex Buffer Object 将顶点数据存储在GPU的内存中: ...
- yocto-sumo源码解析(四):bitbake
1. 环境准备 按照前面几节的分享,我们已经知道了oe-init-build-env是如何建立yocto项目环境的,下面我们继续研究bitbake脚本,在这之前,因为我们选择qemuarm64为目标机 ...
- Docker swarm集群搭建教程
一.什么是Swarm Swarm这个项目名称特别贴切.在Wiki的解释中,Swarm behavior是指动物的群集行为.比如我们常见的蜂群,鱼群,秋天往南飞的雁群都可以称作Swarm behavio ...
- 第四篇——Spring音乐登录界面设计及实现(C#)
Spring音乐播放器,我们小组设计其启动时有一个登录界面,用户初次可以注册,输入用户名和密码,点击注册即将输入信息保存到register文本文件中:如果已有用户名,输入用户名和密码,点击登录,程序会 ...
- 关于断言(Assert)
断言,字面上的意思大致是十分肯定的说,也就是说我们相信这个结果是真的.如果我们的断言不为真,那这个这个结果就和我们预期的结果不一样.在编程上同理,如果程序运行出来的结果和你想要的结果不一致,那你的程序 ...
- 团队作业之旅游行业APP分析
随着经济的发展,不论是在工作中的男女老少,还是在校园中的童鞋,都喜欢在假期来一场说走就走的旅行,来缓解生活中的各种压力.当然,在国家面临经济转型的情况下,更多的将工业,农业转向服务型的旅游业,各个省市 ...
- 注册和卸载window service
自己开发的windows service编译之后会生成的exe文件,不能直接运行,必须通过工具注册进系统的Service. 使用cmd运行命令执行注册和卸载: 注册service: C:\Window ...
- PAT 1044 火星数字
https://pintia.cn/problem-sets/994805260223102976/problems/994805279328157696 火星人是以13进制计数的: 地球人的0被火星 ...