我正在尝试批量插入表“TU”和“TUV”(一对多关系),没有“TU”表格列“HashText”的重复记录,所以我这样做了:
/// <summary>
/// Check if the selected TranslationUnit is exsists at db.
/// </summary>
/// <param name="translationUnit"></param>
/// <returns></returns>
public bool CheckDuplicate(TranslationUnit translationUnit)
{
int FoundedTusCount = db.TUs.Where(tu => tu.HashText == translationUnit.Hash && TmIDList.Any(tm => tm == tu.TMID)).Count();
if(FoundedTusCount > 0)
{
return true;
}
return false;
}
这与DB和很多时间有很多联系。
然后使用addRange()每10000(保存连接时间)记录将剩余项目插入数据库,如下所示:
foreach (TranslationUnit item in Options.TMXFile.Data.Body.TranslationUnits.ToList())
{
TU tu = FillTU(TMID, item);
ReadyTUs.Add(tu);
tu.TUVs = new List<TUV>();
foreach (TranslationUnitVariant item1 in item.TranslationUnitVariants)
{
tu.TUVs.Add( FillTUV(item1));
}
if (ReadyTUs.Count >= 10000)
{
Save();
}
}
Save();
这是保存功能:
private void Save()
{
db.TUs.AddRange(ReadyTUs);
db.SaveChanges();
ReadyTUs.Clear();
db.Dispose();
db = new GTMEntities();
}
我现在的主要问题是时间和许多与DB的连接所以,如果有一些方法可以批量插入TU和TUV表而没有重复的TU - 包含数百万条记录 - 它会好得多。
答案 0 :(得分:0)
一种选择是使用SqlBulkCopy。
基本上,您将所有数据批量插入到临时表中。
然后加入主表和登台表以及DELETE
临时表中匹配的所有记录。
然后INSERT
进入实际表格,其中包含来自临时表的SELECT DISTINCT
的结果。