C# 试图找到通过两个表从.csv循环值的最快(成本最低)方法
我正在构建的应用程序允许用户上传一个.csv文件,该文件最终将填充ID匹配的现有SQL表的字段。首先,我使用LinqToCsv和C# 试图找到通过两个表从.csv循环值的最快(成本最低)方法,c#,mysql,sql,asp.net-mvc,csv,C#,Mysql,Sql,Asp.net Mvc,Csv,我正在构建的应用程序允许用户上传一个.csv文件,该文件最终将填充ID匹配的现有SQL表的字段。首先,我使用LinqToCsv和foreach循环将.csv导入到临时表中。然后我有另一个foreach循环,它将临时表中的字段循环到ID匹配的现有表中。要使其一致且成功运行,唯一的方法是将第二个foreach循环嵌套在第一个循环中: [HttpPost] public ActionResult UploadValidationTable(HttpPostedFileBase
foreach
循环将.csv导入到临时表中。然后我有另一个foreach
循环,它将临时表中的字段循环到ID匹配的现有表中。要使其一致且成功运行,唯一的方法是将第二个foreach循环嵌套在第一个循环中:
[HttpPost]
public ActionResult UploadValidationTable(HttpPostedFileBase csvFile)
{
var inputFileDescription = new CsvFileDescription
{
SeparatorChar = ',',
FirstLineHasColumnNames = true
};
var cc = new CsvContext();
var filePath = uploadFile(csvFile.InputStream);
var model = cc.Read<Credit>(filePath, inputFileDescription);
try
{
var entity = new TestEntities();
foreach (var item in model)
{
var tc = new TemporaryCsvUpload
{
Id = item.Id,
CreditInvoiceAmount = item.CreditInvoiceAmount,
CreditInvoiceDate = item.CreditInvoiceDate,
CreditInvoiceNumber = item.CreditInvoiceNumber,
CreditDeniedDate = item.CreditDeniedDate,
CreditDeniedReasonId = item.CreditDeniedReasonId,
CreditDeniedNotes = item.CreditDeniedNotes
};
entity.TemporaryCsvUploads.Add(tc);
var idMatches = entity.Authorizations.ToList().Where(x => x.Id == tc.Id);
foreach (var number in idMatches)
{
number.CreditInvoiceDate = tc.CreditInvoiceDate;
number.CreditInvoiceNumber = tc.CreditInvoiceNumber;
number.CreditInvoiceAmount = tc.CreditInvoiceAmount;
number.CreditDeniedDate = tc.CreditDeniedDate;
number.CreditDeniedReasonId = tc.CreditDeniedReasonId;
number.CreditDeniedNotes = tc.CreditDeniedNotes;
}
}
entity.SaveChanges();
entity.Database.ExecuteSqlCommand("TRUNCATE TABLE TemporaryCsvUpload");
TempData["Success"] = "Updated Successfully";
}
catch (LINQtoCSVException)
{
TempData["Error"] = "Upload Error: Ensure you have the correct header fields and that the file is of .csv format.";
}
return View("Upload");
}
[HttpPost]
public ActionResult UploadValidationTable(HttpPostedFileBase csvFile)
{
var inputFileDescription=新的CsvFileDescription
{
SeparatorChar=',',
FirstLineHasColumnNames=true
};
var cc=new CsvContext();
var filePath=uploadFile(csvFile.InputStream);
var model=cc.Read(文件路径,inputFileDescription);
尝试
{
var实体=新测试实体();
foreach(模型中的var项目)
{
var tc=新的临时CSVUPLOAD
{
Id=项目Id,
CreditInvoiceAmount=item.CreditInvoiceAmount,
CreditInvoiceDate=item.CreditInvoiceDate,
CreditInvoiceNumber=item.CreditInvoiceNumber,
CreditDeniedDate=项。CreditDeniedDate,
CreditDeniedReasonId=item.CreditDeniedReasonId,
CreditDeniedNotes=item.CreditDeniedNotes
};
entity.TemporaryCsvUploads.Add(tc);
var idMatches=entity.Authorizations.ToList(),其中(x=>x.Id==tc.Id);
foreach(idMatches中的变量编号)
{
number.CreditInvoiceDate=tc.CreditInvoiceDate;
number.CreditInvoiceNumber=tc.CreditInvoiceNumber;
number.CreditInvoiceAmount=tc.CreditInvoiceAmount;
number.CreditDeniedDate=tc.CreditDeniedDate;
number.CreditDeniedReasonId=tc.CreditDeniedReasonId;
number.CreditDeniedNotes=tc.CreditDeniedNotes;
}
}
entity.SaveChanges();
entity.Database.ExecuteSqlCommand(“TRUNCATE TABLE temporalycsvupload”);
TempData[“Success”]=“已成功更新”;
}
捕获(LINQtoCSVException)
{
TempData[“Error”]=“上载错误:请确保您有正确的头字段,并且文件为.csv格式。”;
}
返回视图(“上传”);
}
问题是速度。搜索一个包含7000个条目的SQL表、匹配ID并填写字段大约需要1分49秒
所以,我看了这个,认为第二个循环真的不需要嵌套。我把密码调高了,就像这样:
[HttpPost]
public ActionResult UploadValidationTable(HttpPostedFileBase csvFile)
{
var inputFileDescription = new CsvFileDescription
{
SeparatorChar = ',',
FirstLineHasColumnNames = true
};
var cc = new CsvContext();
var filePath = uploadFile(csvFile.InputStream);
var model = cc.Read<Credit>(filePath, inputFileDescription);
try
{
var entity = new TestEntities();
var tc = new TemporaryCsvUpload();
foreach (var item in model)
{
tc.Id = item.Id;
tc.CreditInvoiceAmount = item.CreditInvoiceAmount;
tc.CreditInvoiceDate = item.CreditInvoiceDate;
tc.CreditInvoiceNumber = item.CreditInvoiceNumber;
tc.CreditDeniedDate = item.CreditDeniedDate;
tc.CreditDeniedReasonId = item.CreditDeniedReasonId;
tc.CreditDeniedNotes = item.CreditDeniedNotes;
entity.TemporaryCsvUploads.Add(tc);
}
var idMatches = entity.Authorizations.ToList().Where(x => x.Id == tc.Id);
foreach (var number in idMatches)
{
number.CreditInvoiceDate = tc.CreditInvoiceDate;
number.CreditInvoiceNumber = tc.CreditInvoiceNumber;
number.CreditInvoiceAmount = tc.CreditInvoiceAmount;
number.CreditDeniedDate = tc.CreditDeniedDate;
number.CreditDeniedReasonId = tc.CreditDeniedReasonId;
number.CreditDeniedNotes = tc.CreditDeniedNotes;
}
entity.SaveChanges();
entity.Database.ExecuteSqlCommand("TRUNCATE TABLE TemporaryCsvUpload");
TempData["Success"] = "Updated Successfully";
}
catch (LINQtoCSVException)
{
TempData["Error"] = "Upload Error: Ensure you have the correct header fields and that the file is of .csv format.";
}
return View("Upload");
}
[HttpPost]
public ActionResult UploadValidationTable(HttpPostedFileBase csvFile)
{
var inputFileDescription=新的CsvFileDescription
{
SeparatorChar=',',
FirstLineHasColumnNames=true
};
var cc=new CsvContext();
var filePath=uploadFile(csvFile.InputStream);
var model=cc.Read(文件路径,inputFileDescription);
尝试
{
var实体=新测试实体();
var tc=新的临时csvupload();
foreach(模型中的var项目)
{
tc.Id=项目Id;
tc.CreditInvoiceAmount=item.CreditInvoiceAmount;
tc.CreditInvoiceDate=item.CreditInvoiceDate;
tc.CreditInvoiceNumber=item.CreditInvoiceNumber;
tc.CreditDeniedDate=item.CreditDeniedDate;
tc.CreditDeniedReasonId=item.CreditDeniedReasonId;
tc.CreditDeniedNotes=item.CreditDeniedNotes;
entity.TemporaryCsvUploads.Add(tc);
}
var idMatches=entity.Authorizations.ToList(),其中(x=>x.Id==tc.Id);
foreach(idMatches中的变量编号)
{
number.CreditInvoiceDate=tc.CreditInvoiceDate;
number.CreditInvoiceNumber=tc.CreditInvoiceNumber;
number.CreditInvoiceAmount=tc.CreditInvoiceAmount;
number.CreditDeniedDate=tc.CreditDeniedDate;
number.CreditDeniedReasonId=tc.CreditDeniedReasonId;
number.CreditDeniedNotes=tc.CreditDeniedNotes;
}
entity.SaveChanges();
entity.Database.ExecuteSqlCommand(“TRUNCATE TABLE temporalycsvupload”);
TempData[“Success”]=“已成功更新”;
}
捕获(LINQtoCSVException)
{
TempData[“Error”]=“上载错误:请确保您有正确的头字段,并且文件为.csv格式。”;
}
返回视图(“上传”);
}
这次只花了19秒就完成了。与第一个相比有了很大的改进。但当我检查数据库时,应该匹配的7行中只有一行被填写。有人能找出第二个代码块没有填充所有应该填充的行的原因吗?还是优化第一个块的更好方法?谢谢 第二个循环不起作用的原因是,您在第一个循环中设置了
tc
,但在循环之后定义了匹配项,即var idMatches=entity.Authorizations.ToList()。其中(x=>x.Id==tc.Id)
,因此您只搜索第一个循环中最后一项的Id
。就性能而言,我建议将整个CSV导入临时表,并运行update语句。关系数据库是为这种集合基操作而设计的。最快的方法可能是使用StreamReader和SqlBulkCopy,尽管较少使用ele