public ColumnDiffViewModel(ProjectViewModel mainWindowViewModel)
        {
            this.MainWindowViewModel    = mainWindowViewModel;
            this._detailedCompareResult = new DetailedCompareResult();
            this._queryMetaData         = new TableMetaData();

            RunCommand = new RelayCommand(async() =>
            {
                MainWindowViewModel.Lock();

                DetailedCompareResult result = await GetDetailedDifferences();

                Dispatcher.CurrentDispatcher.Invoke(
                    new Action(() =>
                {
                    if (result != null)
                    {
                        DetailedCompareResult = result;
                    }
                }));
                MainWindowViewModel.UnLock();
            });

            PeekColumnsCommand = new RelayCommand(async() =>
            {
                MainWindowViewModel.Lock();
                QueryMetaData.Columns.Clear();
                var columns = await GetQueryColumnsAsync();

                Dispatcher.CurrentDispatcher.Invoke(
                    new Action(() =>
                {
                    QueryMetaData.TableName = "a";
                    foreach (var col in columns)
                    {
                        QueryMetaData.Columns.Add(col);
                    }
                }));
                MainWindowViewModel.UnLock();
            });

            ViewComparisonReportCommand = new RelayCommand(() => {
                var stats = DetailedCompareResult.GetCalculatedStats();
                var win   = new StatsReportWindow(stats);
                win.ShowDialog();
            }, ViewReportCanExecute);
        }
        private async Task <DetailedCompareResult> GetDetailedDifferences()
        {
            var keyColumns = QueryMetaData.Columns
                             .Where(c => c.IsKeyColumn)
                             .Select(c => c.ColumnName);

            if (keyColumns.Count() == 0)
            {
                System.Windows.Forms.MessageBox.Show("At least one column need to be marked as key");
                return(new DetailedCompareResult());
            }

            var ignoredColumns = QueryMetaData.Columns
                                 .Where(c => c.IsIgnoredInComparisson)
                                 .Select(c => c.ColumnName);

            DetailedCompareResult result = null;

            var a = new Action(() => {
                try
                {
                    var setComparer = QueryConfiguration.GetComparer(MainWindowViewModel.LogWriter);
                    result          = setComparer.GetDetailedDifferences(
                        keyColumns,
                        ignoredColumns
                        );
                }
                catch (Exception e)
                {
                    System.Windows.Forms.MessageBox.Show(e.Message);
                }
            });
            await Task.Run(a);

            return(result);
        }