#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:
Два способа:
- Получите все идентификаторы из базы данных SELECT
SerialNumber FROM SerialNumbersMFG
, а затем вы можете использовать linqlist1.Intersect(list2)
- Как указано в комментарии, в большинстве БД есть
IN
предложение, поэтому вы можете использовать запрос типа:SELECTSerialNumber FROM SerialNumbersMFG WHERE SerialNumber IN (1,2,3...)
который также выполнит требуемую функцию.
Поскольку вы упомянули, что в базе данных могут быть сотни тысяч записей, я бы предположил, что второй способ лучше. Пожалуйста, используйте stringbuilder
для объединения.