//************************
        //*                      *
        //*  ShowTableContainer  *
        //*                      *
        //************************
        // Get and show entities in selected table container. Call from UI thread.

        public void ShowTableContainer(String tableName)
        {
            try
            {
                this.Cursor = Cursors.Wait;

                ContainerDetails.Text = "Loading entity list...";

                TableListView.ItemsSource = null;

                // Create a temporary copy of the TableColumnNames table and add columns as we encounter them.
                // This is done to prume away previously saved colum names that are no longer present in the data.

                var tempTableColumnNames = new Dictionary<string, bool>();

                TableListViewGridView.Columns.Clear();

                AddTableListViewColumn("PartitionKey");
                AddTableListViewColumn("RowKey", false);
                AddTableListViewColumn("Timestamp");

                tempTableColumnNames.Add("PartitionKey", TableColumnNames["PartitionKey"]);
                tempTableColumnNames.Add("RowKey", TableColumnNames["RowKey"]);
                tempTableColumnNames.Add("Timestamp", TableColumnNames["Timestamp"]);

                int containerCount = 0;
                _EntityCollection.Clear();
                TableListView.Visibility = Visibility.Visible;
                EntityToolbarPanel.Visibility = Visibility.Visible;

                CloudTable table = tableClient.GetTableReference(tableName);

                // Query the table and retrieve a collection of entities.
                var query = new TableQuery<ElasticTableEntity>();

                // Limit the number of entities returned from the query, defaulting to 500 if not specified.
                var take = MaxEntityCountFilter > 0 ? MaxEntityCountFilter : 500;
                query.TakeCount = take;

                IEnumerable<ElasticTableEntity> entities;

                if (EntityQueryEnabled)
                {
                    EntityQuery.IsChecked = true;

                    string filterCondition = null;
                    var operation = GetTableQueryOperation(EntityQueryCondition[0]);
                    if (!string.IsNullOrEmpty(operation))
                    {
                        filterCondition = GetQueryFilterCondition(EntityQueryColumnName[0], operation, EntityQueryValue[0]);
                    }

                    if (EntityQueryColumnName.Length > 1)
                    {
                        operation = GetTableQueryOperation(EntityQueryCondition[1]);
                        if (!string.IsNullOrEmpty(operation))
                        {
                            filterCondition = TableQuery.CombineFilters(
                                filterCondition,
                                TableOperators.And,
                                GetQueryFilterCondition(EntityQueryColumnName[1], operation, EntityQueryValue[1]));
                        }
                    }

                    if (EntityQueryColumnName.Length > 2)
                    {
                        operation = GetTableQueryOperation(EntityQueryCondition[2]);
                        if (!string.IsNullOrEmpty(operation))
                        {
                            filterCondition = TableQuery.CombineFilters(
                                filterCondition,
                                TableOperators.And,
                                GetQueryFilterCondition(EntityQueryColumnName[2], operation, EntityQueryValue[2]));
                        }
                    }

                    entities = table.ExecuteQuery(query.Where(filterCondition)).ToList();
                }
                else
                {
                    EntityQuery.IsChecked = false;
                    entities = table.ExecuteQuery(query).ToList();
                }

                if (entities != null)
                {
                    // Iterate through the list of entities.
                    // Ensure a bound column exists in the list view for each.
                    // Add a representation of each entity to the items source for the list view.

                    bool match = false;

                    foreach (ElasticTableEntity entity in entities)
                    {
                        match = false;

                        if (EntityTextFilter == null) match = true;

                        if (MaxEntityCountFilter != -1 && containerCount >= MaxEntityCountFilter) break;

                        foreach (KeyValuePair<String, EntityProperty> prop in entity.Properties)
                        {
                            AddTableListViewColumn(prop.Key);

                            if (!tempTableColumnNames.ContainsKey(prop.Key))
                            {
                                tempTableColumnNames.Add(prop.Key, TableColumnNames[prop.Key]);
                            }
                        }

                        EntityItem item = new EntityItem(entity);

                        if (EntityTextFilter != null)
                        {
                            if (entity.RowKey.IndexOf(EntityTextFilter, 0, StringComparison.OrdinalIgnoreCase) != -1 ||
                                entity.PartitionKey.IndexOf(EntityTextFilter, 0, StringComparison.OrdinalIgnoreCase) != -1)
                            {
                                match = true;
                            }
                            else
                            {
                                foreach(KeyValuePair<String, String> field in item.Fields)
                                {
                                    if (field.Value.IndexOf(EntityTextFilter, 0, StringComparison.OrdinalIgnoreCase) != -1)
                                    {
                                        match = true;
                                    }
                                }
                            }
                        }

                        if (match)
                        {
                            _EntityCollection.Add(item);
                            containerCount++;
                        }

                        TableColumnNames = tempTableColumnNames;
                    }
                }


                if (_EntityCollection != null)
                {
                    foreach (EntityItem entity in _EntityCollection)
                    {
                        entity.AddMissingFields(TableColumnNames);
                    }
                }

                //SortEntityList();

                if (containerCount == 1)
                {
                    ContainerDetails.Text = "(1 entity) as of " + DateTime.Now.ToString();
                }
                else
                {
                    ContainerDetails.Text = "(" + containerCount.ToString() + " entities) as of " + DateTime.Now.ToString();
                }

                TableListView.ItemsSource = EntityCollection;

                this.Cursor = Cursors.Arrow;
            }
            catch(Exception ex)
            {
                this.Cursor = Cursors.Arrow;
                ShowError("Error querying table: " + ex.Message);
            }
        }
        //************************
        //*                      *
        //*  ShowTableContainer  *
        //*                      *
        //************************
        // Get and show entities in selected table container. Call from UI thread.

        private async Task ShowTableContainerAsync(String tableName, bool loadData = true)
        {
            try
            {
                this.Cursor = Cursors.Wait;

                ContainerDetails.Text = "Loading entity list...";

                TableListView.ItemsSource = null;

                // Create a temporary copy of the TableColumnNames table and add columns as we encounter them.
                // This is done to prume away previously saved colum names that are no longer present in the data.

                Dictionary<String, bool> tempTableColumnNames = new Dictionary<string, bool>();

                TableListViewGridView.Columns.Clear();

                AddTableListViewColumn("PartitionKey");
                AddTableListViewColumn("RowKey");
                AddTableListViewColumn("Timestamp", false);

                tempTableColumnNames.Add("PartitionKey", TableColumnNames["PartitionKey"]);
                tempTableColumnNames.Add("RowKey", TableColumnNames["RowKey"]);
                tempTableColumnNames.Add("Timestamp", TableColumnNames["Timestamp"]);

                int containerCount = 0;
                _EntityCollection.Clear();
                TableListView.Visibility = Visibility.Visible;
                EntityToolbarPanel.Visibility = Visibility.Visible;

                if (!loadData)
                {
                    ContainerDetails.Text = "Click Refresh to load the data";
                    return;
                }

                CloudTable table = tableClient.GetTableReference(tableName);

                // Query the table and retrieve a collection of entities.

                var query = new TableQuery<ElasticTableEntity>();

                IEnumerable<ElasticTableEntity> entities = null;

                if (EntityQueryEnabled)
                {
                    EntityQuery.IsChecked = true;

                    for (int i = 0; i < this.EntityQueryColumnName.Length; i++)
                    {
                        this.AppendQueryFilter(
                            query,
                            this.EntityQueryColumnName[i],
                            this.EntityQueryCondition[i],
                            this.EntityQueryValue[i]);
                    }

                    entities = table.ExecuteQuery(query).ToList();
                }
                else
                {
                    EntityQuery.IsChecked = false;
                    entities = table.ExecuteQuery(query).ToList();
                }

                if (entities != null)
                {
                    // Iterate through the list of entities.
                    // Ensure a bound column exists in the list view for each.
                    // Add a representation of each entity to the items source for the list view.

                    bool match = false;

                    foreach (ElasticTableEntity entity in entities)
                    {
                        match = false;

                        if (EntityTextFilter == null) match = true;

                        if (MaxEntityCountFilter != -1 && containerCount >= MaxEntityCountFilter) break;

                        foreach (KeyValuePair<String, EntityProperty> prop in entity.Properties)
                        {
                            AddTableListViewColumn(prop.Key);

                            if (!tempTableColumnNames.ContainsKey(prop.Key))
                            {
                                tempTableColumnNames.Add(prop.Key, TableColumnNames[prop.Key]);
                            }
                        }

                        EntityItem item = new EntityItem(entity);

                        if (EntityTextFilter != null)
                        {
                            if (entity.RowKey.IndexOf(EntityTextFilter, 0, StringComparison.OrdinalIgnoreCase) != -1 ||
                                entity.PartitionKey.IndexOf(EntityTextFilter, 0, StringComparison.OrdinalIgnoreCase) != -1)
                            {
                                match = true;
                            }
                            else
                            {
                                foreach (KeyValuePair<String, String> field in item.Fields)
                                {
                                    if (field.Value.IndexOf(EntityTextFilter, 0, StringComparison.OrdinalIgnoreCase) != -1)
                                    {
                                        match = true;
                                    }
                                }
                            }
                        }

                        if (match)
                        {
                            _EntityCollection.Add(item);
                            containerCount++;
                        }

                        TableColumnNames = tempTableColumnNames;
                    }
                }


                if (_EntityCollection != null)
                {
                    foreach (EntityItem entity in _EntityCollection)
                    {
                        entity.AddMissingFields(TableColumnNames);
                    }
                }

                //SortEntityList();

                if (containerCount == 1)
                {
                    ContainerDetails.Text = "(1 entity) as of " + DateTime.Now.ToString();
                }
                else
                {
                    ContainerDetails.Text = "(" + containerCount.ToString() + " entities) as of " + DateTime.Now.ToString();
                }

                TableListView.ItemsSource = EntityCollection;
            }
            catch (Exception ex)
            {
                ShowError("Error querying table: " + ex.Message);
            }
            finally
            {
                this.Cursor = Cursors.Arrow;
            }
        }