将 PDF 与 SQL 记录进行匹配的更快方法

本文关键字:方法 PDF SQL 记录 | 更新日期: 2023-09-27 18:36:02

我有一个 C# Web 应用程序,它将 PDF 文件与 Azure SQL 服务器数据库中的记录进行匹配。 PDF 文件名的一部分包括记录 ID。 我没有所有记录的所有PDF,因为它们是通过SFTP进入的。 目前,我列出所有文件名,然后遍历该列表,提取记录 ID,在数据库中查找匹配的记录并更新记录。 对于 2k 记录,这大约需要 10 分钟来处理。 我想知道是否有更快或更好的优化方法来处理这个问题?

string us_retail_directory = ConfigurationManager.AppSettings["DFCUSretailloanDirectoryGet"];
string us_post_directory = ConfigurationManager.AppSettings["DFCUSLoanDirectoryPost"];
MoveFileRecords counts = new MoveFileRecords();
DirectoryInfo directory = new DirectoryInfo(us_retail_directory);
FileInfo[] Files = directory.GetFiles("*.pdf");
foreach (FileInfo file in Files)
{
    string fileSplit = Path.GetFileNameWithoutExtension(file.Name);
    string[] strings = fileSplit.Split('_');
    //string loanCode = strings[1];
    string loanCode = strings[1].Remove(strings[1].Length - 3);
    using (LoanFileEntities db = new LoanFileEntities())
    {
        IQueryable<dfc_LoanRecords> query = db.Set<dfc_LoanRecords>();
        dfc_LoanRecords record = query.FirstOrDefault(f => f.loan_code_string == loanCode && f.region == "US");
        if (record != null)
        {
            record.loan_file = file.Name;
            record.found_date = DateTime.Now;
            db.SaveChanges();
            if (!File.Exists(us_post_directory + file.Name))
            { File.Move(file.FullName, us_post_directory + file.Name); }
            else
            {
                string now = string.Format("{0:yyyyMMdd_Hmm}", DateTime.Now);
                File.Move(file.FullName, us_post_directory + "(dup" + now + ")" + file.Name);
            }
            counts.usRetailMove++;
            counts.recordCount++;
        }
        else
        {
            counts.usRetailSkip++;
            counts.recordCount++;
        }
    }
}
return counts;

将 PDF 与 SQL 记录进行匹配的更快方法

每个数据库查找都有一些延迟,而实际数据量可能不是您最大的问题。

因此,尝试通过一次加载多个记录来批处理请求(即使您不会使用所有提取的记录 [必须通过测试确定适当的开销])。您可以在sql中使用列表包含(当具有一组id时)或根据其他适当的机制(例如按日期)预取记录来执行此操作。

然后尝试匹配预取的记录并批处理插入操作。

编辑在您的情况下,您可以使用 loan_code_string 上的包含表达式一次查询多个记录。