public async Task <Table> GetTableData(int tableId, int offset = 0, int limit = 0)
        {
            var tableMeta = await _dbContext.TableInfos.Where(x => x.Id == tableId)
                            .Include(x => x.FieldInfos)
                            .ThenInclude(x => x.FieldType)
                            .FirstAsync();

            if (tableMeta == null)
            {
                throw new TableNotFoundException(tableId);
            }

            var table = _mapper.Map <Table>(tableMeta);

            string selectQuery;

            if (offset == 0 && limit == 0)
            {
                selectQuery = _commandDirector.BuildSelectCommand(table, tableMeta.ViewQuery);
            }
            else
            {
                selectQuery = _commandDirector.BuildPaginationSelectCommand(table, offset, limit, tableMeta.ViewQuery);
            }
            var unhandledRows = _dbContext.CollectFromExecuteSql(selectQuery);

            var rows = new List <Row>();

            foreach (var unhandledRow in unhandledRows)
            {
                var row = new Row {
                    TableId = table.Id
                };

                foreach (var field in table.Fields)
                {
                    unhandledRow.TryGetValue(field.Name, out object obj);
                    if (obj != null)
                    {
                        row.Data[field] = obj;
                    }
                }
                rows.Add(row);
            }

            table.Rows = rows;

            return(table);
        }