Linq中的Enumerable和Queryable内置方法和两个类的区别
一.区别
1、使用场合不同
Enumerable适合在内存数据集合中使用(如数组、List等),Queryable适合在离线数据集合中使用(如EF中的dbContext中的DbSet中使用)
这你不需要自己区分,因为当数组等内存集合使用linq查询时自动使用System.Linq.Enumerable下的方法,当EF的dbContext的DbSet使用linq查询时自动使用System.Linq.Queryable下的方法,
至于为什么呢?下面的不同点给出答案。
2、返回类型不同
上面说了VS会根据你使用的数据集合的类型来自动使用相应命名空间下的方法,这是因为VS选择了最优的使用。
当返回数据集合如Where方法时,Enumerable的Where返回的IEnumerable<>,Queryable的Where返回的是IQueryable<>,
这两个集合有什么区别呢?IEnumerable<>是本地集合存在内存中,而IQueryable<>属于离线集合,在使用到返回的集合IQueryable<>才加载数据,属于延迟加载
二.内置方法
1、All
确定序列中的所有元素是否都满足条件。
2、Any
确定序列是否包含任何元素。
3、Append
将一个值追加到序列末尾。
4、Average
计算序列的平均值。
5、Cast
将 IEnumerable 的元素强制转换为指定的类型。
6、Count
返回序列中的元素数量。
7、DefaultIfEmpty
返回指定序列中的元素;如果序列为空,则返回单一实例集合中的类型参数的默认值。
8、Distinct
通过使用默认的相等比较器对值进行比较,返回序列中的非重复元素。
9、First
返回序列中的第一个元素。
10、FirstOrDefault
返回序列中的第一个元素;如果序列中不包含任何元素,则返回默认值。
11、GroupBy
根据指定的键选择器函数对序列中的元素进行分组,并且从每个组及其键中创建结果值。 通过使用指定的函数对每个组的元素进行投影。
12、Intersect
通过使用默认的相等比较器对值进行比较,生成两个序列的交集。
13、Last
返回序列的最后一个元素。
14、LastOrDefault
返回序列中的最后一个元素;如果序列中不包含任何元素,则返回默认值。
15、Max
返回序列中的最大值。
16、Min
返回序列中的最小值。
17、OrderBy
根据键按升序对序列的元素进行排序
18、OrderByDescending
根据键按降序对序列的元素进行排序。
19、Select
通过合并元素的索引,将序列的每个元素投影到新窗体中。
20、Skip
跳过序列中指定数量的元素,然后返回剩余的元素。
21、SkipWhile
如果指定的条件为 true,则跳过序列中的元素,然后返回剩余的元素。
22、Sum
计算序列的总和。
22、Take
从序列的开头返回指定数量的相邻元素。
23、TakeWhile
只要指定的条件为 true,就会返回序列的元素。
24、ThenBy
根据某个键按升序对序列中的元素执行后续排序。
25、ThenByDescending
使用指定的比较器按降序对序列中的元素执行后续排序。
26、ToList
从 IEnumerable<T> 创建一个 List<T>。
27、Union
通过使用默认的相等比较器,生成两个序列的并集。
28、Where
基于谓词筛选值序列。
29、FromSql
基于原始SQL查询创建LINQ查询。
30、Contains
查询条件为单个字段的的集合,查询list<id> id是否存在 id.contains(数据库。id)