Сравните список в C # с таблицей в базе данных - PullRequest
0 голосов
/ 08 апреля 2019

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

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

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

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

I 'Я видел много мнений о поиске только одного элемента в базе данных, но мне нужен эффективный способ сравнения списков 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 Ответ

0 голосов
/ 08 апреля 2019

Два способа:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...