【发布时间】:2019-01-31 04:56:03
【问题描述】:
我正在尝试根据用户聚合大约 200 万行。 一个用户有多个事务,每个事务都有一个平台和一个事务类型。我将平台和事务类型列聚合为 json 并保存为一行。
但是我的代码很慢。 如何提高性能?
public static void AggregateTransactions()
{
using (var db = new ApplicationDbContext())
{
db.ChangeTracker.AutoDetectChangesEnabled = false;
//Get a list of users who have transactions
var users = db.Transactions
.Select(x => x.User)
.Distinct();
foreach (var user in users.ToList())
{
//Get all transactions for a particular user
var _transactions = db.Transactions
.Include(x => x.Platform)
.Include(x => x.TransactionType)
.Where(x => x.User == user)
.ToList();
//Aggregate Platforms from all transactions for user
Dictionary<string, int> platforms = new Dictionary<string, int>();
foreach (var item in _transactions.Select(x => x.Platform).GroupBy(x => x.Name).ToList())
{
platforms.Add(item.Key, item.Count());
};
//Aggregate TransactionTypes from all transactions for user
Dictionary<string, int> transactionTypes = new Dictionary<string, int>();
foreach (var item in _transactions.Select(x => x.TransactionType).GroupBy(x => x.Name).ToList())
{
transactionTypes.Add(item.Key, item.Count());
};
db.Add<TransactionByDay>(new TransactionByDay
{
User = user,
Platforms = platforms, //The dictionary list is represented as json in table
TransactionTypes = transactionTypes //The dictionary list is represented as json in table
});
db.SaveChanges();
}
}
}
更新
因此数据的基本视图如下所示:
交易数据:
编号:b11c6b67-6c74-4bbe-f712-08d609af20cf, 用户 ID:1, 平台ID:3, TransactiontypeId: 1
ID:4782803f-2f6b-4d99-f717-08d609af20cf, 用户 ID:1, 平台ID:3, TransactiontypeId: 4
将数据聚合为 TransactionPerDay:
ID:9df41ef2-2fc8-441b-4a2f-08d609e21559, 用户 ID:1, 平台:{“p3”:2}, 交易类型:{"t1":1,"t4":1}
所以在这种情况下,两个事务被聚合为一个。可以看到平台和交易类型会聚合成json。
【问题讨论】:
-
在您的代码中,您似乎在一次又一次地做同样的事情。除了速度慢之外,其目的也是不可理解的。您能否提供一部分数据作为样本以及您真正想要做的事情。
-
您的
_transactions查询与user无关。这是故意的吗?对我来说没有意义。 -
@CetinBasoz 我更新了我的问题
-
@IvanStoev 抱歉,这是一个错字。已更新,谢谢。
-
我在代码中添加了一些 cmets,希望它能让我的意图更加清晰。
标签: c# sql-server entity-framework .net-core