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