/// <summary>
        /// Gets values in the given table with given select and filter params
        /// </summary>
        /// <returns>
        /// Returns list of values which match the given parameters
        /// </returns>
        public async Task <JArray> GetValues(string tableName, string[] selectColumns, string filterUrlParam)
        {
            // Select parameter in Dataverse API accepts comma separated column names
            var selectQueryColumns = string.Join(",", selectColumns);

            // Params for select query
            var selectUrlParam = $"$select={selectQueryColumns}";

            UriBuilder requestUri = new UriBuilder("https", dataverseConfig.Value.ApiBaseUrl);

            requestUri.Path  = tableName;
            requestUri.Query = $"{selectUrlParam}&$filter={filterUrlParam}";

            var response = await dataverseClient.GetAsync(requestUri.Uri);

            if (!response.IsSuccessStatusCode)
            {
                throw new DataverseException(Constant.InvalidInsertDataColumns);
            }

            // Parse response
            var responseString = await response.Content.ReadAsStringAsync();

            // Dataverse get response model
            var responseJson = DataverseGetResponse.FromJson(responseString);

            return(responseJson.Values);
        }
        /// <summary>
        /// Update existing data row
        ///  1. Get guid of row with given baseId and isLatestColumnName 1
        ///  2. Create batch request for the 3 operations
        /// </summary>
        /// <returns>
        /// Task
        /// </returns>
        public async Task UpdateAddData(
            string baseRowGuid,
            dynamic updatedData,
            string updateTableName,
            string updateTableIdColumn,
            dynamic newData,
            string addTableName,
            string addTableIdColumn)
        {
            // 1. Get guid of row with given baseId and isLatestColumnName 1
            string[] requiredColumns = { updateTableIdColumn, Constant.baseIdColumnName, Constant.isLatestColumnName };

            // Select parameter in Dataverse API accepts comma separated column names
            var selectQueryColumns = string.Join(",", requiredColumns);

            // Params for select query
            var selectUrlParam = $"$select={selectQueryColumns}";

            // Params for select query
            var filterUrlParam = $"$filter={Constant.baseIdColumnName} eq {baseRowGuid} and {Constant.isLatestColumnName} eq '{Constant.IsLatestTrue}'";

            UriBuilder requestUri = new UriBuilder("https", dataverseConfig.Value.ApiBaseUrl);

            requestUri.Path  = updateTableName;
            requestUri.Query = $"{selectUrlParam}&{filterUrlParam}";

            var response = await dataverseClient.GetAsync(requestUri.Uri);

            if (!response.IsSuccessStatusCode)
            {
                throw new DataverseException(Constant.InvalidUpdateDataColumns);
            }

            // All current records
            var responseString = await response.Content.ReadAsStringAsync();

            // Dataverse get response model
            var responseJson = DataverseGetResponse.FromJson(responseString);

            var values = responseJson.Values;

            // There should be exactly one row with {isLatestColumnNameName} == 1
            if (values.Count != 1)
            {
                throw new DataverseException(Constant.InvalidUpdateDataColumns);
            }

            var firstValue = values[0];

            var oldStringGuid = Convert.ToString(firstValue[updateTableIdColumn], cultureInfo);

            // 2. Create batch request for the 3 operations
            await BatchUpdateAdd(oldStringGuid, baseRowGuid, updatedData, updateTableName, newData, addTableIdColumn, addTableName);
        }
        /// <summary>
        /// Update existing data row
        ///  1. Get guid of row with given baseId and isLatestColumnName 1
        ///  2. Set isLatestColumnName to 0 for this row
        ///  3. Insert new row with updated data columns with given baseId and isLatestColumnName set to 1
        /// </summary>
        /// <returns>
        /// Task
        /// </returns>
        public async Task UpdateData(string baseRowGuid, dynamic newDataRow, string idColumn, string tableName)
        {
            string[] requiredColumns = { idColumn, Constant.baseIdColumnName, Constant.isLatestColumnName };

            // Select parameter in Dataverse API accepts comma separated column names
            var selectQueryColumns = string.Join(",", requiredColumns);

            // Params for select query
            var selectUrlParam = $"$select={selectQueryColumns}";

            // Params for select query
            var filterUrlParam = $"$filter={Constant.baseIdColumnName} eq {baseRowGuid} and {Constant.isLatestColumnName} eq '{Constant.IsLatestTrue}'";

            UriBuilder requestUri = new UriBuilder("https", dataverseConfig.Value.ApiBaseUrl);

            requestUri.Path  = tableName;
            requestUri.Query = $"{selectUrlParam}&{filterUrlParam}";

            var response = await dataverseClient.GetAsync(requestUri.Uri);

            if (!response.IsSuccessStatusCode)
            {
                throw new DataverseException(Constant.InvalidUpdateDataColumns);
            }

            // All current records
            var responseString = await response.Content.ReadAsStringAsync();

            // Dataverse get response model
            var responseJson = DataverseGetResponse.FromJson(responseString);

            var values = responseJson.Values;

            // There should be exactly one row with {isLatestColumnNameName} = 1
            if (values.Count != 1)
            {
                throw new DataverseException(Constant.InvalidUpdateDataColumns);
            }

            var firstValue = values[0];

            var oldStringGuid = Convert.ToString(firstValue[idColumn], cultureInfo);

            // 1. Mark existing record as old. Passing the record's GUID to be marked as old
            // 2. Insert updated record as new
            await BatchUpdate(oldStringGuid, baseRowGuid, newDataRow, tableName);
        }