Мне нужно сравнить список последовательных целых чисел, созданных из C# Windows Form, с таблицей целых чисел в базе данных, указав, есть ли дубликаты.
У меня есть версия, которая работает, ниже, но я предполагаю, что это, вероятно, наименее эффективный способ сделать это - сравнение списка 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;





Два пути:
SerialNumber FROM SerialNumbersMFG, а затем вы можете использовать linq list1.Intersect(list2)IN, поэтому вы можете использовать такой запрос, как: SELECTSerialNumber FROM SerialNumbersMFG WHERE SerialNumber IN (1,2,3...), который также сделает требуемое.Поскольку вы упомянули, что в БД могут быть сотни тысяч записей, я бы предположил, что второй способ лучше. Пожалуйста, используйте stringbuilder для конкатенации.
Почему бы не сделать
Where SerialNumber IN YourCommaDelimitedListofNumbers? Таким образом, вы возвращаете все номера из базы данных, которые соответствуют (уже существуют). Кроме того, вы не должныSelect *, если вы не собираетесь использовать все возвращаемые столбцы. Выберите, что будет использоваться.