更快捷地将PDF与SQL记录匹配

时间:2016-02-23 17:18:36

标签: c# sql-server

我有一个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;

1 个答案:

答案 0 :(得分:1)

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

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

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

修改 在您的情况下,您可以使用loan_code_string上的Contains表达式一次查询多个记录。