【发布时间】:2017-08-07 21:13:35
【问题描述】:
场景:Data Transfer\Link 来自旧数据库的记录,根据我创建的新模式将实体更新到新数据库中。
您对改进这些代码有什么建议吗?我真的需要能够取得出色的表现。
提前谢谢你!
private async Task LinkCategoriesToBillingTransactions()
{
var legacyTransactions = _legacyDb
.TbTransactions
.AsNoTracking()
.Where(x => x.Id >= 1150534);
foreach (var legacyTransaction in legacyTransactions)
{
var legacyTransactionTask = _legacyDb.TbCategories
.AsNoTracking()
.SingleOrDefaultAsync(x =>
x.Id == legacyTransaction.CategoryId);
var transactionTask = _cmDb.BillingTransactions
.SingleOrDefaultAsync(x =>
x.UniqueId == legacyTransaction.Guid);
await Task.WhenAll(legacyTransactionTask, transactionTask);
var legacyCategory = legacyTransactionTask.Result;
var transaction = transactionTask.Result;
if (legacyCategory == null || transaction == null)
continue;
var transactionCategory = await _cmDb.Categories
.SingleOrDefaultAsync(x =>
x.UniqueId == legacyCategory.Guid);
transaction.Category = transactionCategory;
await _cmDb.SaveChangesAsync();
}
}
【问题讨论】:
-
实体框架和性能并没有真正结合在一起。
-
如果你想要性能,我会在 SQL、MySql、Oracle 等中创建一个处理后端的过程。使用 EF 在中间数据访问层做事并想要性能就像在说:“我怎么能用这些雪鞋跑得更快?”。您可能会得到一些答案,但实际上您正在做一个 SingleOrDefault 一次只取回一个对象,所以我会更担心如果这在您连接的内容开始时很慢,以及为什么该连接在做一个时很慢对象返回。
-
谢谢@djangojazz。也将尝试使用 sql 过程。
标签: performance linq entity-framework-6 asp.net-core-1.1