Как сохранить данные, полученные из запроса - PullRequest
1 голос
/ 21 мая 2011

Я ранее задавал вопрос и получил ответ на Лучший подход для написания запроса , но проблема в том, что если вам нужно сохранить этот результат в списке, то возникает дублирование записей. Например результирующая таблица соединения дана ПРИМЕР

Смотрите, есть повторяющиеся строки. Как вы можете отфильтровать их, и при этом сохранить данные номера заказа? Конечно, могут быть некоторые пути, но я ищу несколько отличных способов

Как мы можем хранить данные в списке, а не создавать повторяющиеся строки в списке?

Мой текущий код для моих таблиц

  int lastUserId = 0;
  sql_cmd = new SqlCommand();
  sql_cmd.Connection = sql_con;

  sql_cmd.CommandText = "SELECT * FROM AccountsUsers LEFT JOIN Accounts ON AccountsUsers.Id = Accounts.userId ORDER BY AccountsUsers.accFirstName";
  SqlDataReader reader = sql_cmd.ExecuteReader();

  if (reader.HasRows == true)
  {
      Users userToAdd = new Users();

      while (reader.Read())
      {
           userToAdd = new Users();
           userToAdd.userId = int.Parse(reader["Id"].ToString());
           userToAdd.firstName = reader["accFirstName"].ToString();
           userToAdd.lastName = reader["accLastName"].ToString();
           lastUserId = userToAdd.userId;

           Websites domainData = new Websites();
           domainData.domainName = reader["accDomainName"].ToString();
           domainData.userName = reader["accUserName"].ToString();
           domainData.password = reader["accPass"].ToString();
           domainData.URL = reader["accDomain"].ToString();
           userToAdd.DomainData.Add(domainData);

           allUsers.Add(userToAdd);
       }
    }

Для второй таблицы у меня есть пользовательский список, в котором будут храниться записи всех данных во второй таблице.

Возвращенная таблица - это таблица, содержащая объединения и имеющие несколько строк для одного и того же

Ответы [ 4 ]

1 голос
/ 22 мая 2011

Помимо использования словарной идеи, на которую ответил Антонио Бакула ...

Если вы сохраняете словарь пользователей и вызываете код в своем образце несколько раз, вы должны учитывать, что учетная запись пользователя либо новая, либо измененная, либо удаленная.

При выполнении SQL-запроса используется следующий алгоритм:

  1. Если строка в результате запроса отсутствует в словаре, создайте и добавьте в него нового пользователя.
  2. Если строка в результате запроса находится в словаре, обновите информацию о пользователе.
  3. Если элемент словаря отсутствует в результате запроса, удалить пользователя из словаря.

Я бы также рекомендовал не использовать SELECT *
Используйте только те столбцы таблицы, которые необходимы вашему коду, это повышает производительность вашего кода и предотвращает потенциальное нарушение безопасности, возвращая частную информацию пользователя.

1 голос
/ 21 мая 2011

Я не уверен, почему вы не используете различные предложения в вашем sql для получения уникальных результатов. и это будет быстрее. Вы смотрели на использование хеш-таблиц.

0 голосов
/ 21 мая 2011

Похоже, корень вашей проблемы в вашей таблице базы данных.Когда вы сказали, что дублирующиеся строки данных, вы говорите, что получаете дублирующиеся записи в списке, или у вас есть дублирующиеся данные в вашей таблице?

Дайте 2 дублирующихся строки.

Два варианта: Первый,предотвратить извлечение дубликатов данных из sql с помощью отдельного предложения, такого как: выберите отличный от где

Второй вариант, как упомянуто Антонио, заключается в проверке, если он уже есть в списке.

Первый вариант рекомендуется, если толькоЕсть и другие причины.

0 голосов
/ 21 мая 2011

Я бы поместил пользователей в Dictonary и проверил бы, существует ли уже, что-то вроде этого:

Dictionary<int, Users> allUsers = new Dictionary<int, Users>()

, а затем в цикле Reader while:

int userId = int.Parse(reader["Id"].ToString());
Users currUser = allUsers[userId];

if (currUser == null)
{
  currUser = new Users();
  currUser.userId = userId);
  currUser.firstName = reader["accFirstName"].ToString();
  currUser.lastName = reader["accLastName"].ToString();
  allUsers.Add(userID, currUser);
}

Websites domainData = new Websites();
domainData.domainName = reader["accDomainName"].ToString();
domainData.userName = reader["accUserName"].ToString();
domainData.password = reader["accPass"].ToString();
domainData.URL = reader["accDomain"].ToString();
currUser.DomainData.Add(domainData);
...