一、 IEnumerable/IQueryable Where(Lambda expression)方法
1.Where的基础用法:使用Where可以对IEnumerable、IQueryable类型的数据进行查询并返回满足条件的数据:
2.Where方法除了上述接收一个参数以外,还能够接收第二个参数index,即当前遍历数据的索引:
(来自《C#高级编程》(第7版):筛选出LastName以A开头,且排名位于偶数位的赛车手)
二、获取一条数据
1.LINQ中获取一条数据有以下四个方法:
Single:有且只有一条满足要求的数据(要求结果集中只能有一条数据)
SingleOrDefault:最多只有一条满足要求的数据(若没有任何满足要求的数据,则各个数据项的返回值均是该数据类型的默认值,例如int型则返回0,对于引用类型,如对象,返回null)
First:至少有一条,返回第一条数据(没有则报错)
FirstOrDefault:返回第一条数据或默认值
2.Single():只返回一条数据,例如集合中只有一个元素,若有多个元素,则报错:
(报错信息:序列中含有多于一条数据)
从集合中筛选出只含一个元素的集合(Name==”张三”)后再调用Single()方法:
运行结果:
也可以将两条语句合为一句:
var employee1 = list.Where(e => e.Name == “张三”).Single();
Single()方法中也可以传入Lambda表达式,即Single(Lambda expression)因此,上面的代码可以进一步简化:
var employee1 = list.Single(e=>e.Name==“张三”);
3.SingleOrDefault([Lambda expression]):最多只有一条满足要求的数据(若没有任何满足要求的数据,则各个数据项的返回值均是该数据类型的默认值,例如int型则返回0,对于引用类型,如对象,返回null)
示例代码
运行结果:
即,返回对象的默认值null
注意,要是有多条符合条件的数据,则报错:4.First([Lambda Expression]):返回数据集中的第一条数据,也可以在参数中传入查询条件:
若数据集中没有匹配数据,则报错
5.FirstOrDefault:返回第一条或默认值,比如没有匹配数据,则返回null。
三、使用LINQ表达式构建组合查询
1.类似于SQL,通过LINQ表达式构建组合查询的思路类似于直接使用Sql,首先构建全真查询表达式(where true),然后根据传入条件,逐个进行非空判定,或者直接转换为IQueryable。若不为空则将条件补充到表达式当中。如下图所示:
在下面的自定义WhereIf()方法中对上面的代码进行了进一步的优化
四、封装自定义WhereIf()方法
1.方法声明:IQueryable WhereIf(this IQueryable source,bool condition,Expression<Func<TSource, bool>> predicate)
2.参数:
(1)this IQueryable source:扩展方法所在类型
(2)bool condition:执行条件,若为真执行后面的predicate表达式,反之不执行
(3)Expression<Func<TSource, bool>> predicate:Lambda表达式,封装查询条件
3.封装代码:
4.方法调用
五、OfType方法
1.使用OfType方法可以筛选出序列中指定类型的数据。
运行: