protected override void ProcessInternal() { Debug.Assert(_database.TableExists(SqlTable.WuHistory)); var selectSql = PetaPoco.Sql.Builder.Select("ID", "ProjectID", "ProjectRun", "ProjectClone", "ProjectGen", "DownloadDateTime", "COUNT(*)") .From("WuHistory") .GroupBy("ProjectID", "ProjectRun", "ProjectClone", "ProjectGen", "DownloadDateTime") .Append("HAVING COUNT(*) > 1"); int count = 0; int totalCount = 0; _logger.Info("Checking for duplicate WU History entries..."); using (var table = _database.Select(selectSql.SQL)) { int lastProgress = 0; foreach (DataRow row in table.Rows) { var deleteSql = PetaPoco.Sql.Builder.Append("DELETE FROM WuHistory") .Where("ID < @0 AND ProjectID = @1 AND ProjectRun = @2 AND ProjectClone = @3 AND ProjectGen = @4 AND datetime(DownloadDateTime) = datetime(@5)", row.ItemArray[0], row.ItemArray[1], row.ItemArray[2], row.ItemArray[3], row.ItemArray[4], row.ItemArray[5]); int result = _database.Execute(deleteSql.SQL, deleteSql.Arguments); if (result != 0) { _logger.DebugFormat("Deleted rows: {0}", result); totalCount += result; } count++; int progress = Convert.ToInt32((count / (double)table.Rows.Count) * 100); if (progress != lastProgress) { string message = String.Format(CultureInfo.CurrentCulture, "Deleting duplicate {0} of {1}.", count, table.Rows.Count); OnProgressChanged(new ProgressChangedEventArgs(progress, message)); lastProgress = progress; } } } if (totalCount != 0) { _logger.InfoFormat("Total number of duplicate WU History entries deleted: {0}", totalCount); } }