将 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;
每个数据库查找都有一些延迟,而实际数据量可能不是您最大的问题。
因此,尝试通过一次加载多个记录来批处理请求(即使您不会使用所有提取的记录 [必须通过测试确定适当的开销])。您可以在sql中使用列表包含(当具有一组id时)或根据其他适当的机制(例如按日期)预取记录来执行此操作。
然后尝试匹配预取的记录并批处理插入操作。
编辑在您的情况下,您可以使用 loan_code_string 上的包含表达式一次查询多个记录。