IEnumerable
IEnumerable接口是所有集合类型的祖宗接口,其作用相当于Object类型之于其它类型。如果某个类型实现了IEnumerable接口,就意味着它可以被迭代访问,也就可以称之为集合类型(可枚举);
ICollection
ICollection继承于IEnumerable接口,并且扩展了IEnumerable接口。
主要扩展的功能有:
-
新增了属性Count,用于记录集合元素个数
-
支持添加元素和移除元素
-
支持是否包含某元素
-
支持清空集合等等
对于任何实现了ICollection接口的集合,我们都可以通过第1条Count属性获取当前集合的元素数,所以这些集合也被称为计数集合。
IList
IList接口直接继承于ICollection接口和IEnumerable接口,并且扩展了通过索引操作集合的功能。
主要扩展的功能有:
-
通过索引获取集合中某个元素
-
通过元素获取元素在集合中的索引值
-
通过索引插入元素到集合指定位置
-
移除集合指定索引处的元素
IDictionary
IDictionary接口直接继承于ICollection接口和IEnumerable接口,存储的元素是键值对,扩展了通过键操作键值对集合的功能。
主要扩展的功能有:
-
通过键KEY获取值VALUE
-
插入新的键值对{KEY:VALUE}
-
是否包含KEY
-
通过KEY移除键值对元素
=======================================================
当我们使用到EF时,不得不说 IEnumerable(集合) 和 IQueryable(EF里的DbSet<T>) 里的 SQO 本质不一样!:
集合 的 标准查询运算符 方法 ,是来自于 System.Linq.Enumerable 里 给 IEnumerable 接口添加的扩展方法
EF上下文里的 DBSet<T> 里的 标准查询运算符 方法,来自于 System.Linq.Queryable 里给 IQueryable接口 添加的扩展方法
EF的集合中采用IQueryable接口原因是,延迟加载,也就是我们查询出来的并不是集合而是
IQueryable<UsersAddress> addrs = db.UsersAddresses.Where(a => a.udUId == 1); //以接口的方式返回
之所以返回一个接口,而不是具体的数据集合,因为我们并不知道后面是否还有查询条件,所以采用这种方式去拼接查询条件,如:
addrs.Where(a=>a.mIsDel==fales);
这个时候返回的还是接口,还是在拼接条件,并没有生成sql语句去数据库查询,当我们使用到了集合中的变量时或者使用 addrs.ToList();
就会生成SQL语句真正的去数据库查询数据。
IEnumerable 又叫做本地查询,因为就是在本地内存中的数据集合,IQueryable 的操作并没有查询数据,而是延迟查询