[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
~~~