Сравнить список на C # с таблицей в базе данных

#c# #sql

#c# #sql

Вопрос:

Мне нужно сравнить список последовательных целых чисел, созданный из формы C # Windows, с таблицей целых чисел базы данных, указывающей, есть ли дубликаты.

У меня есть версия, которая работает ниже, но я предполагаю, что это, вероятно, наименее эффективный способ сделать это — сравнивать список C # один за другим с каждым целым числом в таблице базы данных.

Должен ли я получить целые числа из базы данных в C #, а затем сравнить? Или есть SQL-способ задать:

если какой-либо элемент в списке A содержится в списке B и т.д. … без сравнения каждого номера по одному?

Я видел много мнений о том, чтобы просто искать 1 элемент в базе данных, но мне нужен эффективный способ сравнения списков C #, иногда из 5000 или более, с таблицей базы данных, которая в конечном итоге может содержать сотни тысяч записей.

 public static string VerifyManufacturingSerialOnly(int count, int beginning)
        {
            string duplicateSerials = "";
            int currentSerial = beginning;

            for (int i = 0; i < count; i  )
            {
                OleDbConnection connection = BadgeDatabaseDB.GetConnection();
                string checkStatement
                    = "SELECT * "
                      "FROM SerialNumbersMFG "
                      "WHERE SerialNumber = @CurrentSerial";
                OleDbCommand command =
                    new OleDbCommand(checkStatement, connection);
                command.Parameters.AddWithValue("@CurrentSerial", currentSerial);                

                try
                {
                    connection.Open();
                    OleDbDataReader dataReader =
                        command.ExecuteReader(CommandBehavior.SingleRow);
                    if (dataReader.Read())
                    {
                        duplicateSerials  =
                            "Serial # "  
                            currentSerial  
                            " already exists in order # "  
                            dataReader["OrderNumber"].ToString()   "n";
                    }
                    else {  }
                }
                catch (OleDbException ex)
                {
                    throw ex;
                }
                finally
                {
                    connection.Close();
                }
                currentSerial  ;
                i  ;
            }
            return duplicateSerials;
  

Комментарии:

1. Почему бы не сделать Where SerialNumber IN YourCommaDelimitedListofNumbers ? Таким образом, вы возвращаете все числа из базы данных, которые соответствуют (уже существуют). Кроме того, вы не должны Select * , если вы не собираетесь использовать все возвращаемые столбцы. Выберите, что будет использоваться.

Ответ №1:

Два способа:

  1. Получите все идентификаторы из базы данных SELECT SerialNumber FROM SerialNumbersMFG , а затем вы можете использовать linq list1.Intersect(list2)
  2. Как указано в комментарии, в большинстве БД есть IN предложение, поэтому вы можете использовать запрос типа: SELECTSerialNumber FROM SerialNumbersMFG WHERE SerialNumber IN (1,2,3...) который также выполнит требуемую функцию.

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