请查看以下情况:
我确实有一个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个字段:
GlnCode
,Description
,VendorID
和Item 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/