[TOC]
## ITraversable
该ITraversable接口表示能够被查询的一系列值。这是所有查询对象的基本接口,它支持以下方法:
### 查询
* where - 根据指定的谓词过滤值
* orderBy[Ascending|Descending]->thenBy[Ascending|Descending]... - 根据指定的排序函数和方向对值进行排序
* skip - 跳过指定的值
* take - 根据供应量限制值的数量
* slice - 根据指定的偏移量和数量检索一段值
* indexBy - 根据指定的映射函数对值进行索引
* keys - 获取键作为值
* reindex - 根据其基于0的位置索引值
* groupBy - 根据指定的分组函数对值进行分组
* join->on/onEquality[->withDefault]->to - 根据指定的过滤器将值与所指定的值进行匹配,然后根据指定的功能将投影结果
* groupJoin->on/onEquality[->withDefault]->to - 根据指定的过滤器将值与提供的值进行匹配,对结果进行分组,然后根据指定的函数进行投影
* unique - 仅返回唯一值
* select - 根据指定的函数映射值
* selectMany - 根据提供的函数映射值并合并结果
* first - 返回第一个值,如果为空则返回null
* last - 返回最后一个值,如果为空则返回null
* contains - 如果指定的值存在于中集合中,则返回
* offsetGet - 返回指定的索引处的值
* offsetExists - 指定的索引是否存在值
### 聚集
* count - 元素的数量
* isEmpty - 是否没有元素
* aggregate - 根据指定的函数聚合值
* maximum - 最大值
* minimum - 最小值
* sum - 所有值的总和
* average - 所有值的平均值
* all - 是否所有值都为true
* any - 是否有任何值计算为true
* implode - 用指定的分隔符连接所有值
### 集合/列表操作
* append - 将指定的元素追加到数据源
* whereIn - 所有值都存在于数据源和指定的值中
* except - 从数据源中移除指定的元素
* union - 数据源或指定的值中存在的唯一值
* intersect - 数据源和提指定的值中都有唯一值
* difference - 唯一值存在于 数据源中但不在指定的值中
### 其他
* getIterator - 以迭代器的形式获取元素,将非标量键映射到整数
* getTrueIterator - 以迭代器的形式获取元素
* asArray - 将元素转换为数组。非标量键将被映射到整数
* asTraversable - 将元素转换为一个 ITraversable实例
* asCollection - 将元素转换为一个 ICollection实例
## ICollection
该ICollection接口表示一系列可变的值,它们可以使用以下方法进行操作和更改:
* apply - 为每一项值应用指定函数
* groupJoin->on/onEquality[->withDefault]->apply - 根据指定的过滤器将值与指定的值进行匹配,然后使用指定的函数进行结果的分析。
* addRange - 将一组值添加到集合中
* remove - 从集合中删除所有出现的值
* removeRange - 从集合中删除所有出现的一组值
* removeWhere - 根据提供的谓词功能删除值
* clear - 从集合中删除所有值。
* offsetSet - 将值设置为提供的索引
* offsetUnset - 删除指定的索引中的任何值
## IQueryable
该IQueryable接口代表的是另一个版本的ITraversable接口。它提供了和ITraversable相同的API,但通过使用IQueryProvider,它支持查询外部数据源。
## IRepository
该IRepository接口代表的是另一个版本的ICollection接口。它提供了和 ICollection相同的API,但通过使用IRepositoryProvider,它支持查询和改变外部数据源。
## 限制
* 在查询中,不应该使用控制结构,例如if, switch, goto, while, foreach,...,这些控制结构不被归类为有效的查询表达式,不能与外部数据源一起使用。
* 像下面这样在同一行上定义多个相同的查询函数,将会抛出异常。因为无法明确到底要应用哪个函数:
~~~
$queryable->where(function ($i) { return $i > 50; })->where(function ($i) { return $i !== 70; });
~~~
## 标准类
在API旁边,是实现PINQ每个接口的一组标准。如果您需要为PINQ API添加自定义功能,则应扩展这些类,因为它们包含标准API 的正确测试实现。
提供以下类型:
~~~
Traversable implements ITraversable
Collection implements ICollection
Queryable implements IQueryable
Repository implements IRepository
~~~