请查看以下情况:

我确实有一个CSV文件,我会导入几个字段(在使用实体框架和工作单元和存储库设计模式的SQL Server中并非全部导入)。

var newGenericArticle = new GenericArticle
{
    GlnCode = data[2],
    Description = data[5],
    VendorId = data[4],
    ItemNumber = data[1],
    ItemUOM = data[3],
    VendorName = data[12]
};

var unitOfWork = new UnitOfWork(new AppServerContext());
unitOfWork.GenericArticlesRepository.Insert(newGenericArticle);

unitOfWork.Commit();


现在,唯一标识记录的唯一方法是检查4个字段:GlnCodeDescriptionVendorIDItem Number

因此,在插入记录之前,需要检查是否存在:

 var unitOfWork = new UnitOfWork(new AppServerContext());

 // If the article is already existing, update the vendor name.
 if (unitOfWork.GenericArticlesRepository.GetAllByFilter(
         x => x.GlnCode.Equals(newGenericArticle.GlnCode) &&
              x.Description.Equals(newGenericArticle.Description) &&
              x.VendorId.Equals(newGenericArticle.VendorId) &&
              x.ItemNumber.Equals(newGenericArticle.ItemNumber)).Any())
 {
     var foundArticle = unitOfWork.GenericArticlesRepository.GetByFilter(
         x => x.GlnCode.Equals(newGenericArticle.GlnCode) &&
              x.Description.Equals(newGenericArticle.Description) &&
              x.VendorId.Equals(newGenericArticle.VendorId) &&
              x.ItemNumber.Equals(newGenericArticle.ItemNumber));

     foundArticle.VendorName = newGenericArticle.VendorName;

     unitOfWork.GenericArticlesRepository.Update(foundArticle);
 }


如果已存在,则需要对其进行更新,您可以在上面的代码中看到它。

现在,您需要知道我正在导入约1.500.000条记录,所以很多。
正是过滤器使CPU几乎达到100%。

“ GetAllByFilter”方法非常简单,可以执行以下操作:

return !Entities.Any() ? null : !Entities.Where(predicate).Any() ? null : Entities.Where(predicate).AsQueryable();


其中predicate等于Expression<Func<TEntity, bool>>

我能做些什么来确保服务器的CPU没有达到100%?

注意:我正在使用SQL Server 2012

亲切的问候

最佳答案

该任务的工具错误。您永远不要一次处理超过一百万条记录。使用批量插入和清理(如果需要)将记录插入到临时表中,然后使用存储的proc以基于集合的方式进行处理或使用为此设计的工具SSIS。

关于c# - 如何提高 Entity Framework 工作单元的绩效,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29623270/

10-09 03:43