将C#中的列表与数据库中的表进行比较

时间:2019-04-08 01:07:35

标签: c# sql

我需要将C#Windows窗体创建的顺序整数列表与整数数据库表进行比较,以指示是否存在重复项。

下面我有一个可行的版本,但是我认为这可能是最不高效的方法-将C#列表与数据库表中的每个整数一一比较。

我应该将数据库中的整数放入C#中,然后进行比较吗?还是有一种SQL方式询问:

如果列表A中的任何项目包含在列表B中,等等。。。而没有一个一个地比较每个数字?

关于在数据库中查找一项,我已经看到了很多意见,但是我需要一种有效的方法,将有时5,000或更多的C#列表与最终有数十万条记录的数据库表进行比较。

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 :(得分:0)

两种方法:

  1. 从数据库SELECT SerialNumber FROM SerialNumbersMFG获取所有ID,然后可以使用linq list1.Intersect(list2)
  2. 如评论中所述,大多数数据库都有IN子句,因此您可以使用类似SELECTSerialNumber FROM SerialNumbersMFG WHERE SerialNumber IN (1,2,3...)的查询,它也可以完成所需的工作。

由于您提到DB可以拥有数十万条记录,所以我建议第二种方法更好。请使用stringbuilder进行串联。