public final function Fetch($distinct = false, Sql\Condition $where = null, Sql\OrderList $orderBy = null, Sql\GroupList $groupBy = null, $offset = 0, $count = null, Sql\Join $join = null, Sql\JoinType $joinType = null, Sql\Condition $joinCondition = null)
    {
        $t = $this->Table();
        $src = $t;
        if ($join)
        {
            if (!$joinType || !$joinCondition)
                throw new \InvalidArgumentException("If join is given, a join type and join condition are also required.");
            
            $src = $join->Join($t, $joinType, $joinCondition, true);
        }
        $sql = $this->SqlBuilder();
        $select = $sql->Select($distinct, $t->ToSelectList(), $src, $where, $orderBy, $groupBy, $offset, $count);
        
        $reader = $this->Connection()->ExecuteQuery((string)$select);
        return $this->FetchFromReader($reader);
    }