c# linq where on object lists 非常慢
c# linq where on object lists incredibly slow
我有一个看起来像这样的设置
foreach(Master m in masters){
m.details = allDetails.Where(d => d.ID == m.detailID).ToList();
}
masters 和 AllDetails 只是对象列表,这里没有实际的 SQL 运行。我早些时候这样做了。我实际上没有写 "normal" sql 连接查询,因为我希望这种方式相当快...
这 运行 非常慢,对于大约 20k 个主条目需要 20 多秒。
我知道我一定遗漏了一些非常明显的东西,但我就是想不通是什么。解决这个超级常见问题的方法是什么?
对于每个 Master
遍历整个 allDetails
列表。您应该使用分组并创建字典:
var detailsPerMaster = allDetails.GroupBy(d => d.ID)
.ToDictionary(g => g.Key, g => g.ToList());
然后您可以设置您的 details
属性:
foreach(Master m in masters)
m.details = detailsPerMaster[m.detailID];
或者为了更好地匹配您的结果:
foreach(Master m in masters)
m.details = detailsPerMaster.TryGetValue(m.detailID, out var list) ? list : new List<--detailTypeHere-->();
我有一个看起来像这样的设置
foreach(Master m in masters){
m.details = allDetails.Where(d => d.ID == m.detailID).ToList();
}
masters 和 AllDetails 只是对象列表,这里没有实际的 SQL 运行。我早些时候这样做了。我实际上没有写 "normal" sql 连接查询,因为我希望这种方式相当快...
这 运行 非常慢,对于大约 20k 个主条目需要 20 多秒。
我知道我一定遗漏了一些非常明显的东西,但我就是想不通是什么。解决这个超级常见问题的方法是什么?
对于每个 Master
遍历整个 allDetails
列表。您应该使用分组并创建字典:
var detailsPerMaster = allDetails.GroupBy(d => d.ID)
.ToDictionary(g => g.Key, g => g.ToList());
然后您可以设置您的 details
属性:
foreach(Master m in masters)
m.details = detailsPerMaster[m.detailID];
或者为了更好地匹配您的结果:
foreach(Master m in masters)
m.details = detailsPerMaster.TryGetValue(m.detailID, out var list) ? list : new List<--detailTypeHere-->();