我正在编写一个小程序,它以.csv文件作为输入,大约有45k行。我试图将此文件的内容与数据库中表格的内容进行比较(通过Xrm.Sdk使用SQL Server通过动态CRM,如果有区别)。
在我的当前程序中(需要约25分钟进行比较-文件和数据库都是完全相同的,都有45k行没有差异),我在一个继承Collection和IEnumerable的DataCollection中拥有所有现有记录。
在下面的代码中,我使用Where方法进行筛选,然后根据匹配数进行逻辑操作。Where似乎是瓶颈所在。是否有比这更有效的方法?我绝不是LINQ专家。
在我的当前程序中(需要约25分钟进行比较-文件和数据库都是完全相同的,都有45k行没有差异),我在一个继承Collection和IEnumerable的DataCollection中拥有所有现有记录。
在下面的代码中,我使用Where方法进行筛选,然后根据匹配数进行逻辑操作。Where似乎是瓶颈所在。是否有比这更有效的方法?我绝不是LINQ专家。
foreach (var record in inputDataLines)
{
var fields = record.Split(',');
var fund = fields[0];
var bps = Convert.ToDecimal(fields[1]);
var withdrawalPct = Convert.ToDecimal(fields[2]);
var percentile = Convert.ToInt32(fields[3]);
var age = Convert.ToInt32(fields[4]);
var bombOutTerm = Convert.ToDecimal(fields[5]);
var matchingRows = existingRecords.Entities.Where(r => r["field_1"].ToString() == fund
&& Convert.ToDecimal(r["field_2"]) == bps
&& Convert.ToDecimal(r["field_3"]) == withdrawalPct
&& Convert.ToDecimal(r["field_4"]) == percentile
&& Convert.ToDecimal(r["field_5"]) == age);
entitiesFound.AddRange(matchingRows);
if (matchingRows.Count() == 0)
{
rowsToAdd.Add(record);
}
else if (matchingRows.Count() == 1)
{
if (Convert.ToDecimal(matchingRows.First()["field_6"]) != bombOutTerm)
{
rowsToUpdate.Add(record);
entitiesToUpdate.Add(matchingRows.First());
}
}
else
{
entitiesToDelete.AddRange(matchingRows);
rowsToAdd.Add(record);
}
}
编辑:我可以确认在执行此代码之前,所有的existingRecords
都已经在内存中。上述循环中没有进行IO或DB访问。