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) 本身并不具 ...
随机推荐
- RabbitMQ使用注意
1.通常发布者发布结束后会释放Channel,但是消费者由于是异步监听,消费者的Channel不可以释放,否则就断开连接无法监听. 2.当使用默认配置时,ConnectionFactory不指定Por ...
- Vigenere加密
Vigenere加密法原理很简单,实现起来也不难.与普通的单码加密法不同,明文经过加密之后,每个字母出现的频率就不会有高峰和低峰. 密钥中字母代表行和明文中的字母代表行.在vigenere表中找到对应 ...
- Beta阶段展示博客
Beta阶段展示博客 1. 团队成员的简介和个人博客地址 刘畅 博客园ID:森高Slontia 身份:PM 个人介绍: 弹丸粉 || 小说创作爱好者 || 撸猫狂魔(x || 生命的价值在于创造 (我 ...
- Alpha阶段结束分数(百分制)
- 基于SSH框架的学生选课质量属性分析
系统:学生选课系统 框架:SSH(Struts2+Spring+Hibernate) 我做的是基于SSH框架的学生选课系统.学生选课系统的特性:①系统响应时间短,能够快速调出课程数据供学生选课提交.② ...
- 《大象Think in UML》阅读笔记(三)
Think in UML 阅读笔记(三) 把从现实世界中记录下来的原始需求信息,再换成一种可以知道开发的表达方式.UML通过被称为之概念化的过程来建立适合计算机理解和实现的模型,这个模型被称为分析模型 ...
- 03-java学习-基本数据类型-运算符-键盘接收用户输入
java的八大基本数据类型: 类型转换的基本原则: java整数的默认类型是int,小数的默认类型是double 运算符: 算术运算符.连接.赋值.关系.逻辑.三目运算符等…… 键盘接收用户输入: j ...
- VSCODE 使用gitlab 推送代码的简单总结
1. 前提条件: 有一个gitlab 服务器 自己的windows机器上面已经形成了 ssh key 以及进行了 gitlab global config 的配置 能够正常联系gitlab数据库 2. ...
- ThinkPHP从零开始(一)安装和配置
序: 对PHP一无所知的我,将从这里从零开始. 1.下载与安装 ThinkPHP的下载: ThinkPHP中文站下载页面 有 核心版和完整版两种,由于不了解.所以我选择了完整版. WampSer ...
- Allowed Letters CodeForces - 1009G(状压思维)
题意: 给出一个字符串 给出几个定点必须是哪个字母(或者是几个字母中的一个) 然后求在满足所有定点后的最小字符串 解析: 没错 这题是暴力 用状压暴力 “a - f” 用”0 - 5“ 这几个数字代 ...