下面对各子句解释

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. Lucene + Pinyin4J 提供首字母搜索(——)

    遇到一个集团需求,要求在地址查询时候提供拼音搜索,第一反应应该不难,不过实现过程中却一波三折. 1.第一步是讲字段首字母进行索引,具体可以使用Pinyin4j提供的方法完成. 2.原来系统用的luce ...

  2. FMDB数据库框架

    nFMDB   nFMDB n什么是FMDB pFMDB是iOS平台的SQLite数据库框架 pFMDB以OC的方式封装了SQLite的C语言API p nFMDB的优点 p使用起来更加面向对象,省去 ...

  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. 经典卷积神经网络的学习(三)—— Inception Net

    Google Inception Net 首次出现在 ILSVRC 2014 的比赛中(和 VGGNet 同年),就以较大优势拔得头筹.那届比赛中的 Inception Net 一般被称为 Incep ...

  5. FrameLayout帧布局

    一.FrameLayout(帧布局)重点: FrameLayout(帧布局)可以说是五大布局中最为简单的一个布局,这个布局会默认把控件放在屏幕上的左上角的区域,后续添加的控件会覆盖前一个,如果控件的大 ...

  6. 读取Jar包外面的配置文件

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/shenxiandashu/article/details/79193705 比较常用的方法是将pro ...

  7. 将gdal源码转化为VS工程编译过程记录

    作者:朱金灿 来源:http://blog.csdn.net/clever101 为什么要用VS工程的方式来编译gdal库?主要还是为了调试方便,虽然理论上使用命令行方式生成库也能调试,详见:GDAL ...

  8. yii2.0表单《《提交》》变量设置

    public $enableCsrfValidation = false;

  9. 编码(encode)问题

    1. UTF-8 与 GBK UTF-8: 允许含 BOM,但通常不含 BOM 用以解决国际上字符的一种多字节编码, 英文:8 bits(1 byte) 中文:24 bits(3 bytes) UTF ...

  10. 简明Python3教程(A Byte of Python 3)

    关键字:[A Byte of Python v1.92(for Python 3.0)] [A Byte of Python3] 简明Python教程 Python教程 简明Python3教程  简明 ...