本篇文章我们将演示LINQ扩展包的基础语法,以Any、All、Single、Skip、Take、Top等函数为例,目前LINQ支持两种语法,我会在每个案例前先用大家熟知的SQL语句表达,再在后面用C#的两种LINQ语法分别实现。LINQ语法第一次接触难免感到陌生,最好的学习方式就是在项目中多去使用,相信会有很多感悟。
基础语法Ⅱ
在学习之前,我们要做一些准备工作,我们需要创建User对象和包含User对象的集合,作为后面查询和输出的数据源,参见这篇文章C#进阶之LINQ表达式总结完成准备工作。
数据源:
⑥ Any/All 函数
Any()函数判断判断是否至少存在一个符合元素符合条件;All()函数判断是否全部元素都符合条件;下面以Any()函数为例:
/* SQL里的表达: 查找用户里是否存在年龄小于30岁职业是医生的女性 */
select count(*) from user where occupation = "Doctor" and gender = false and age < 30; //返回符合的个数
/* C#版本1 */
bool result = (from u in list where u.age < 30 where !u.gender where u.occupation == "Doctor" select u).Any();
/* C#版本2 */
bool result = list.Any(u => u.age < 30 && !u.gender && u.occupation == "Doctor");
数据源中所有医生如下:
可以看到,目前我们数据源里是有Liu Shuai这一条符合三个属性(小于30岁/医生/女性)的。
true /* 输出结果 */
这里Any()函数是只要存在至少一个符合全部条件的结果,即返回布尔值True,只有在一个都不符合条件的情况下才会返回False;与之相反,All()函数只有在全部数据都符合全部条件的情况下,才会返回True,只要有一条不满足就返回False;All()函数的语法和Any()函数的语法相同,上面的例子把Any()直接替换成All()即可。
⑦ Single/SingleOrDefault 函数
Single()判断是否只有一个元素符合条件,若成立则返回该元素,若不成立则抛出异常。
/* SQL里的表达: 查找用户里年龄小于30岁职业是医生的女性 */
select * from user where occupation = "Doctor" and gender = false and age < 30
/* C#版本1 */
User userResult = (from u in list where u.age < 30 where !u.gender where u.occupation == "Doctor" select u).Single();
/* C#版本2 */
User userResult = list.Single(u => u.age < 30 && !u.gender && u.occupation == "Doctor");
{id = 6, name = Liu Shuai, age = 29, gender = False, occupation = Doctor} /* 输出结果 */
Single()要求有且只有一条满足要求的数据,多条满足条件或一条也没有,此方法会报错;
SingleOrDefault()要求最多有一条满足要求的数据,多条满足条件,此方法会报错;没有数据则返回数据类型的默认值;
类似的还有First()、FirstOrDefault()、Last()、LastOrDefault(),这里给大家做了一个异常表格记录了各种情况的返回值:
函数 | 没有满足 | 一条满足 | 多条满足 | list本身为Null |
Single | 异常 | 该元素 | 异常 | 异常 |
SingleOrDefault | 默认值 | 该元素 | 异常 | 异常 |
First | 异常 | 该元素 | 第一个元素 | 异常 |
FirstOrDefault | 默认值 | 该元素 | 第一个元素 | 异常 |
Last | 异常 | 该元素 | 末尾的元素 | 异常 |
LastOrDefault | 默认值 | 该元素 | 末尾的元素 | 异常 |
面对可能出现的异常,我们一般在使用这类方法时要进行Try{…}Catch(…){…}。
⑧ Skip/Take/Top 函数
/* SQL里的表达: 查找用户表自然排序第4个人到第6个人的姓名*/
select name from user limit 3,3;
/* C#版本1 */
List<string> nameList = (from u in list select u.name).Skip(3).Take(3).ToList();
/* C#版本2 */
List<string> nameList = list.Skip(3).Take(3).Select(x => x.name).ToList();
Liu Guangzhi, Liu Ziming, Liu Shuai /* 输出结果 */
同理,Top(n)表示截取前n条数据。
Damon, Chinese, Liu Guangzhi, Software development engineer, CSDN quality creator, Ali Cloud expert blogger, Microsoft Technology Associate, Good at C#, Java, PHP, Python, etc, Love sports, Workaholic, Communist.