下面对各子句解释

from子句:查询表达式的开始子句,查询表达式必须以from子句开头。

格式:from u in source

其中u表示范围变量,它表示源序列中的每个后续元素,source为数据源。

查询表达式可以包含多个from子句,当源序列中的每个元素本身就集合或者包含集合时,

可使用附加的from子句。

IEnumerable<City> cityQuery =
from country in countries
from city in country.Cities
where city.Population > 10000
select city;

group子句:查询语句的一种结束子句

格式 group item by item.Id

其中item是需要分组的源,by后面表达式是分组依据。

使用group子句可以产生按照指定键组织的组序列。键可以为任何数据类型。

select子句:查询语句的另一种结束子句

格式 :select item或select new {id=Item.Id,Name=Item.Name}
select和SQL的select一致,表示需要"选择的数据或列"。它可以产生所有其他类型的序列。

简单的select子句只是与数据源中包含对象相同的数据类型(前者)。

使用select子句可以将源数据转换为新类型是序列,这个转换也叫投影(后者)。

var queryNameAndPop =
from country in countries
select new { Name = country.Name, Pop = country.Population };

用new来生成一个匿名类。

into子句

可以在select和group之间使用into子句存储查询时的临时标识符,相当于临时变量,用来当做中转站。

当必须在分组或选择操作之后对查询执行附加操作时需要这样做。

var percentileQuery =
from country in countries
let percentile = (int) country.Population / 10000000
group country by percentile into countryGroup
where countryGroup.Key >= 20
orderby countryGroup.Key
select countryGroup;

把group分组之后的序列通过into存在countryGroup中,在通过where筛选,

orderby排序,最后通过select选中需要的序列或列集合。

where子句

格式:where 条件

使用where子句可以根据一个或多个条件筛选数据源的某些元素。

IEnumerable<City> queryCityPop =
from city in cities
where city.Population < 200000 && city.Population > 100000
select city;

当有多个条件时,可以使用&&这样的操作符,也可以使用多个where子句来实现。多个where表示与的关系。

orderby子句

格式:orderby  item descending/ascending

使用orderby子句可以按升序或降序对结果进行排序,还可以指定次要排序顺序。

其中desecnding表示降序,ascending表示升序。

IEnumerable<Country> querySortedCountries =
from country in countries
orderby country.Area, country.Population descending
select country;

多个item重要层次一次递减,也就是首先以第一位的依据排序。

join子句

join相当于SQL的join连接查询。

使用join子句可以根据每个元素指定键之间的相等比较,对一个数据源中的元素

与另外一个数据源中元素进行关联或组合。在LINQ中,联接操作是针对其元素具

有不同类型的对象序列执行的。在联接两个序列后,不许使用select或group指定

要存储到输出系列中的元素。

var categoryQuery =
from cat in categories
join prod in products on cat equals prod.Category
select new { Category = cat, Name = prod.Name };

on后面接的表达式表示联接筛选条件。select可以筛选cat和prod中的任何成员。

equals表示相等,equals两边的数据类型要求一致。

let子句

使用let可以将表达式(如方法的调用)的结果存储到新的范围变量中。

例如:

string[] names = { "Svetlana Omelchenko", "Claire O'Donnell", "Sven Mortensen", "Cesar Garcia" };
IEnumerable<string> queryFirstNames =
from name in names
let firstName = name.Split(new char[] { ' ' })[0]
select firstName;

foreach (string s in queryFirstNames)
Console.Write(s + " ");

一个查询表达式里的范围变量可以同时存在,在select后可同时获取范围变量。

let和into是有相似之处的,只是在特殊的情况下必须使用into。

string[] str = { "12","sdfs"};

var temp = from u in str
let a = u
where a=="1"
select new
{
t1 = a,
t2 = u[0]

};

子查询

查询子句本身可能包含要给查询表达式,该查询表达式成为"子查询",

每个子查询都以它自己的from子句开头,该子句不一定指向第一个from

子句中的同一数据源。

var queryGroupMax =
from student in students
group student by student.GradeLevel into studentGroup
select new
{
Level = studentGroup.Key,
HighestScore =
(from student2 in studentGroup
select student2.Scores.Average())
.Max()
};

处理Null值

采用预防方式避免null引用异常

var query1 =
from c in categories
where c != null
join p in products on c.ID equals
(p == null ? null : p.CategoryID)
select new { Category = c.Name, Name = p.Name };

因为==操作符的优先级高于?:操作符,

所以上述表达式表示的是p如果等于null则赋值为null。

LINQ学习笔记(三)的更多相关文章

  1. C# LINQ学习笔记三:LINQ to OBJECT之操作字符串

    本笔记摘抄自:https://www.cnblogs.com/liqingwen/p/5814204.html,记录一下学习过程以备后续查用. 一.统计单词在字符串中出现的次数 请注意,若要执行计数, ...

  2. Oracle学习笔记三 SQL命令

    SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)  

  3. [Firefly引擎][学习笔记三][已完结]所需模块封装

    原地址:http://www.9miao.com/question-15-54671.html 学习笔记一传送门学习笔记二传送门 学习笔记三导读:        笔记三主要就是各个模块的封装了,这里贴 ...

  4. JSP学习笔记(三):简单的Tomcat Web服务器

    注意:每次对Tomcat配置文件进行修改后,必须重启Tomcat 在E盘的DATA文件夹中创建TomcatDemo文件夹,并将Tomcat安装路径下的webapps/ROOT中的WEB-INF文件夹复 ...

  5. java之jvm学习笔记三(Class文件检验器)

    java之jvm学习笔记三(Class文件检验器) 前面的学习我们知道了class文件被类装载器所装载,但是在装载class文件之前或之后,class文件实际上还需要被校验,这就是今天的学习主题,cl ...

  6. VSTO学习笔记(三) 开发Office 2010 64位COM加载项

    原文:VSTO学习笔记(三) 开发Office 2010 64位COM加载项 一.加载项简介 Office提供了多种用于扩展Office应用程序功能的模式,常见的有: 1.Office 自动化程序(A ...

  7. Java IO学习笔记三

    Java IO学习笔记三 在整个IO包中,实际上就是分为字节流和字符流,但是除了这两个流之外,还存在了一组字节流-字符流的转换类. OutputStreamWriter:是Writer的子类,将输出的 ...

  8. NumPy学习笔记 三 股票价格

    NumPy学习笔记 三 股票价格 <NumPy学习笔记>系列将记录学习NumPy过程中的动手笔记,前期的参考书是<Python数据分析基础教程 NumPy学习指南>第二版.&l ...

  9. Learning ROS for Robotics Programming Second Edition学习笔记(三) 补充 hector_slam

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...

  10. Learning ROS for Robotics Programming Second Edition学习笔记(三) indigo rplidar rviz slam

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...

随机推荐

  1. IT增值服务实践心得体会:企业客户的钱比个人客户好赚得多

    友情提示 本人喜欢直言不讳,不喜欢拐弯抹角.喜欢从客观和主观.自身和他人等多种角度去探讨问题.如有不当之处,欢迎吐槽. 若干心得体会1.企业客户的钱更好赚,个人客户的钱很难.  为什么这么说呢? a. ...

  2. 虚拟机的ip网络设置的选择

    首先看一下vm的这几个设置 通过截图可以基本看到几个网络设置的区别,具体体现在虚拟机装好以后,网络设置会多出两个适配器,不同模式会分配不同区段的ip,需要固定时主要区段要求 所以总结一下 1.桥连,适 ...

  3. Enhancing network controls in mandatory access control computing environments

    A Mandatory Access Control (MAC) aware firewall includes an extended rule set for MAC attributes, su ...

  4. Codeforces C. Pattern 412 解决问题的方法

    这个问题是比较暴力的法律主体. 主要是检查每一个是否没有使用足够的?.假设优先使用其他的无论是什么字母,假设你一定不能使用?. 找一个有能力并给予所有的字符串匹配字符串,而且采用的最小?号码. 原标题 ...

  5. Ubuntu server使用命令行上板VPNclient

    Ubuntu server使用命令行上板VPNclient VPN,虚拟专用网络,这个技术还是非常有用的.近期笔者參与的项目中就使用上了VPN,大概情况是这种.有两个开发团队,在异地,代码服务器在深圳 ...

  6. 【33.33%】【codeforces 681D】Gifts by the List

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...

  7. 【26.87%】【codeforces 712D】Memory and Scores

    time limit per test2 seconds memory limit per test512 megabytes inputstandard input outputstandard o ...

  8. hadoop中国字、词频统计和排序

    例如需求,下面: 有被看作图输入文件中. 代表ip地址,之后的偶数列代表搜索词.数字(奇数列)代表搜索次数.使用"\t"分隔.如今须要对搜索词进行分词并统计词频,此处不考虑搜索次数 ...

  9. 调试分析工具 (C/C++)

    一.静态分析工具 cppcheck cppcheck主要用于对C/C++源代码进行分析检查的一个开源工具,可以用来检测未使用的变量.越界访问.内存泄漏等问题. 使用方法 cppcheck --enab ...

  10. WPF中桌面屏保的制作(主要代码)

    原文:WPF中桌面屏保的制作(主要代码) 制作要点:(1) 使用System.Windows.Threading.DispatcherTimer;(2) 将Window属性设置为:      this ...