protected void OnButtonFineDuplicatesClicked(object sender, EventArgs e)
        {
            progressOp.Visible          = true;
            progressOp.Adjustment.Value = 0;
            progressOp.Text             = "Получаем дубликаты адресов из базы...";
            QSMain.WaitRedraw();

            DeliveryPoint mainPointAlias = null;

            var dublicateSubquery = QueryOver.Of <DeliveryPoint>()
                                    .Where(x => x.Counterparty.Id == mainPointAlias.Counterparty.Id &&
                                           x.Latitude == mainPointAlias.Latitude &&
                                           x.Longitude == mainPointAlias.Longitude &&
                                           x.Id != mainPointAlias.Id &&
                                           (x.Code1c == null || mainPointAlias.Code1c == null || x.Code1c == mainPointAlias.Code1c))
                                    .Select(x => x.Id);

            var list = uow.Session.QueryOver <DeliveryPoint>(() => mainPointAlias)
                       .WithSubquery.WhereExists(dublicateSubquery)
                       .Fetch(x => x.Counterparty).Eager
                       .OrderBy(x => x.Counterparty).Asc
                       .ThenBy(x => x.Latitude).Asc
                       .ThenBy(x => x.Longitude).Asc
                       .List();

            progressOp.Adjustment.Upper = list.Count + 3;
            progressOp.Text             = "Обрабатываем адреса...";
            progressOp.Adjustment.Value++;
            QSMain.WaitRedraw();

            Duplicates = new List <DublicateNode>();
            DublicateNode lastDuplicate = null;

            foreach (var dp in list)
            {
                if (lastDuplicate == null || !lastDuplicate.Compare(dp))
                {
                    lastDuplicate = new DublicateNode();
                    Duplicates.Add(lastDuplicate);
                }
                lastDuplicate.Addresses.Add(new AddressNode(lastDuplicate, dp));
                progressOp.Adjustment.Value++;
                QSMain.WaitRedraw();
            }

            Duplicates.ForEach(x => x.FineMain());
            progressOp.Adjustment.Value++;
            QSMain.WaitRedraw();

            Duplicates = Duplicates.OrderBy(x => x.CounterParty).ThenBy(x => x.FirstAddress1c).ToList();
            progressOp.Adjustment.Value++;
            QSMain.WaitRedraw();

            ObservableDuplicates = new GenericObservableList <DublicateNode>(Duplicates);

            ytreeviewDuplicates.SetItemsSource(ObservableDuplicates);
            progressOp.Visible = false;
        }
 public AddressNode(DublicateNode dupNode, DeliveryPoint dp)
 {
     Address         = dp;
     myDuplicateNode = dupNode;
 }