下面对各子句解释

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. 通过引入SiteMesh的JSP标签库,解决Freemarker与SiteMesh整合时,自定义SiteMesh标签的问题

    不少web项目,都用到了SiteMesh.SiteMesh可以和JSP.Freemarker等模版进行整合,有一定的好处,当然也有其不好的地方.我个人觉得,如果没有必要,不要在项目中引入太多的工具和技 ...

  2. 【27.48%】【codeforces 699D】 Fix a Tree

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

  3. WPF 使用 Pandoc 把 Markdown 转 Docx

    原文:WPF 使用 Pandoc 把 Markdown 转 Docx 本文告诉大家如何通过 WPF 使用 Pandoc 把 Markdown 转 Docx 文件 在之前有文章使用 Pandoc 把 M ...

  4. 三星260亿美元的豪赌:想垄断DRAM和NAND闪存市场(规模经济让对手难以招架)

    腾讯科技讯 据外媒报道,经过50年的发展,半导体市场仍然显得非常活跃,它在今年有望增长20%.随着高增长而来的是供应短缺,这就是DRAM和闪存价格为什么今年会上涨的原因. 三星在DRAM和闪存市场占有 ...

  5. 开始使用Material UI

    Material-UI采用 Material Design风格的React UI组件,所以要想学习material ui先要了解react. material ui安装 Material-UI 可以使 ...

  6. WPF 窗体基类实现的体验及实现回车到下一控件

    原文:WPF 窗体基类实现的体验及实现回车到下一控件 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/jsyhello/article/details ...

  7. 在sql语句中 inner join ,left join,right join 和on 以及where

    当使用几种join的时候,on是指表连接起来基于的条件,where是对连接的表进行过滤的条件. where 1=1  当我们需要拼接字符串的时候 在基础sql字符串中写上where 1=1 可以不需要 ...

  8. cacti由snmp监控带宽

    1.安装和配置snmp a. yum install -y net-snmp net-snmp-utils b. chkconfig snmpd on c. chkconfig –list|grep ...

  9. WPF 用Clip属性实现蒙板特效

    原文:WPF 用Clip属性实现蒙板特效 上一篇,已简单介绍Clip属性的用法,这一篇用它来实现简单蒙板功能,很简单,直接上代码 <Window x:Class="擦除效果.MainW ...

  10. Distinct去除重复项

    之前在做权限模块时,因不同角色可能拥有相同的菜单,导致呈现在浏览器上时出现重复菜单项,所以需要在获取用户拥有菜单项时需要过滤重复项, 用到了Distinct,两个重载 public static IQ ...