Afzaal Ahmad Zeeshan
Цитата:
Мой SQL-запрос возвращает около 6 записей lac.
У вас должна быть действительно веская причина, чтобы получить так много записей; создание сервера отчетов?
Цитата:
Я должен удалить строки, которые имеют повторяющееся значение для одного из столбцов : AccountID.
Как уже упоминал Мацей, проделайте эту операцию в базе данных. Причина вполне очевидна,
Цитата:
Я перебираю набор данных в коде C# с помощью цикла for и удаляю записи, проверяя значение столбца AccountID, если он уже существует
Смотрите сами, вы просите сервер предоставить вам записи 6lac (каждая запись занимает время, а затем и в сети это тоже занимает время, вы можете использовать ее локально, но ваши пользователи будут иметь ее на удаленном соединении). Как только вы закончите с этим, вы теперь заставляете свой процессор находить дубликаты и удалять их. Худший способ написать SQL-запрос, а затем найти и удалить дубликаты. Лучшим способом сделать это было бы либо использование
SELECT DISTINCT
, или путем группировки данных вместе с помощью
GROUP BY
.
Цитата:
Этот процесс занимает очень много времени. Пожалуйста, предложите альтернативные способы удаления дубликатов записей на основе значения столбца: AccountID.
Вы хотите навсегда удалить записи? Я сомневаюсь в этом, поэтому вы хотите, чтобы данные были агрегированы и не дублировались. В этом случае, пожалуйста, используйте подход, который я упомянул выше.
Если вы хотите удалить данные и не хотите допускать дублирование данных (что маловероятно, но все же), то вам нужно использовать столбец в качестве первичного ключа для таблицы.
Вы видите закономерность в моем ответе выше? Я прошу вас об этом
сделать СУБД делать все эти вещи для вас Преимущество заключается в том, что компонент database engine автоматически пропускает записи, которые ему не нужно возвращать, и ваш процессор будет только визуализировать результаты, не беспокоясь о фильтрации.
Выберите примеры (Transact-SQL) | Microsoft Docs[
^] (См.
DISTINCT
примеры)
Группировка по (Transact-SQL) | Microsoft Docs[
^]
Быстрый анализ вашего алгоритма, который вы скопировали отсюда,
c# - лучший способ удалить повторяющиеся записи из таблицы данных - переполнение стека[
^] и вы явно пропустили лучший ответ, чем этот глупый, который был опубликован в той же теме,
c# - лучший способ удалить повторяющиеся записи из таблицы данных - переполнение стека[
^]
public DataTable RemoveDuplicateRows(DataTable dTable, string colName)
{
Hashtable hTable = new Hashtable();
ArrayList duplicateList = new ArrayList();
//Add list of all the unique item value to hashtable, which stores combination of key, value pair.
//And add duplicate item value in arraylist.
foreach (DataRow drow in dTable.Rows)
{
if (hTable.Contains(drow[colName]))
duplicateList.Add(drow);
else
hTable.Add(drow[colName], string.Empty);
}
//Removing a list of duplicate items from datatable.
foreach (DataRow dRow in duplicateList)
dTable.Rows.Remove(dRow);
//Datatable which contains unique records will be return as output.
return dTable;
}
Я бы сказал вам, что это не очень хороший подход, так как у вас есть доступ к базе данных,
напишите лучше запрос Этот подход означает, что ваши 6 записей lac будут снова сохранены в памяти, а затем будет выполнена итерация по ним, чтобы проверить, являются ли они дубликатами или нет.
Это также означает, что если ваша таблица базы данных не имеет дубликатов, этот алгоритм все равно будет работать на ней полмиллиона раз, возможно, сохраняя каждую сущность в хэш-таблице, и даже хуже.
Я могу продолжать, но вы поняли идею. :-)