gpt4 book ai didi

c# - 使用 LINQ to Entities 多次枚举大型数据集

转载 作者:太空宇宙 更新时间:2023-11-03 21:37:23 26 4
gpt4 key购买 nike

假设我的 SQL 数据库中有两个表。1. 一个有数千条记录的中型表 MyTable12. 一个有数百万条记录(并且每天都在增长)的大表 MyTable2

MyTable1 和 MyTable2 都有一个名为 Hash 的属性,它可以相等。

我正在寻找最有效的方法来使用 Linq to Entities 迭代 MyTable1 并找到 MyTable2 中具有相同哈希值的所有记录并保存到另一个表中。这是代码的简化 View 。

using(var db = new context()) {
var myTable1Records = db.MyTable1.Select(x => x);

foreach(var record in myTable1Records) {
var matches = db.MyTable2.Where(y => y.Hash.Equals(record.Hash)).Select(y => y);
foreach(var match in matches) {
// Add match to another table
}
}
}

随着 MyTable2 的大小每天都在变大,我发现这段代码的性能显着下降。我正在尝试有效处理此类场景的一些想法是:

  1. 在 db.MyTable2 上设置 MergeOption.NoTracking,因为它纯粹是一个读取操作。不幸的是,还没有看到很大的改进。
  2. 使用 .ToList() 将 MyTable2 拉入内存以消除对数据库的多次调用
  3. 创建代码可以迭代的 MyTable2“ block ”,这样它就不会每次都查询超过一百万条记录。

我很想看看您是否发现了其他技术或 Elixir 在这种情况下有效。谢谢!

最佳答案

您有一个名为 Hash 的属性。将其用作哈希!将第一个表存储在由 Hash 键控的 Dictionary 中,然后遍历第二个表以检查 Dictionary 中的匹配项,再次由 键控>哈希

或者,更好的是,使用 LINQ:

var matches = db.MyTable1.Intersect(db.MyTable2);

如果您需要进行自定义比较,请创建一个 IEqualityComparer。 (我假设您正在做某种类型的投影,并且 Select(x => x) 是这个问题的占位符。)

或者,更好的是,此操作最好完全在数据库中的存储过程或 View 中进行。您本质上是在执行 JOIN 但使用 C# 来执行此操作。您承担了从数据库到客户端应用程序的往返时间成本,因为这些可能都可以在数据库服务器上完成。

关于c# - 使用 LINQ to Entities 多次枚举大型数据集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21053595/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com