c# linq where 对象列表非常慢

DFE*_*ENS 2 c# linq master-detail

我有一个看起来像这样的设置

foreach(Master m in masters){
   m.details = allDetails.Where(d => d.ID == m.detailID).ToList();
}
Run Code Online (Sandbox Code Playgroud)

masters 和 AllDetails 只是对象列表,这里没有运行实际的 SQL。我早些时候这样做了。我实际上没有写一个“正常”的 sql join 查询,因为我希望这种方式相当快......

这运行得非常慢,就像 20s+ 一样,对于 20k 主条目。

我知道我一定遗漏了一些非常明显的东西,但我无法弄清楚是什么。有什么办法可以解决这个超级常见的问题?

Ren*_*ogt 7

对于每个Master你遍历整个allDetails列表。您应该使用分组并创建一个字典:

var detailsPerMaster = allDetails.GroupBy(d => d.ID)
                                 .ToDictionary(g => g.Key, g => g.ToList());
Run Code Online (Sandbox Code Playgroud)

然后你可以设置你的details属性:

foreach(Master m in masters)        
    m.details = detailsPerMaster[m.detailID];
Run Code Online (Sandbox Code Playgroud)

或者为了更好地匹配您的结果:

foreach(Master m in masters)            
    m.details = detailsPerMaster.TryGetValue(m.detailID, out var list) ? list : new List<--detailTypeHere-->();
Run Code Online (Sandbox Code Playgroud)

  • 天啊,这让我的时间从 20000 毫秒缩短到了 6 点六。那么这里的教训是什么?如果我更喜欢在 C# 而不是 sql 中加入对象,总是查询字典?如果我知道关系是 1-1 有什么区别吗? (2认同)