如何快速比较表格列,2 个表格

Posted

技术标签:

【中文标题】如何快速比较表格列,2 个表格【英文标题】:How can i compare table colums in a fast way, 2 tables 【发布时间】:2016-06-07 15:15:50 【问题描述】:

我有 2 个表,我想知道有多少标记为 IsCkecked=true 的记录在 Table2 中没有数据。 然后我需要将它们标记为假,以便它们得到第二次处理。

第二个程序正在处理所有 Table1 记录并将数据保存到 Table2。

Table1 90.000 条记录 -ID -IsChecked -其他数据

Table2 60.000 条记录 -ID -数据 -其他数据

我有这段代码,它确实可以完成工作,但它太慢了。将 60k 次与 90k 进行比较,一定有更聪明的方法吗? 我怎样才能做得更好?

我可以使用 EF 而不是 Linq 吗?

using DAL;
using System;
using System.Linq;

public class ReadData

DataModelContainer model;

public static void Main()

new ReadData();
Console.WriteLine("Done");
Console.ReadLine();


ReadData()

this.model = new DataModelContainer(); ;

var idRecord = this.model.IdListSet.Where(x => x.IsChecked == true).ToList(); //90.000 Table1
var record = this.model.CompRegSet.Where(z => z.htmlRecord != null).ToList(); //60.000 Table2
Console.WriteLine("This many ID's are marked: " + idRecord.Count);
Console.WriteLine("This many have data: " + record.Count);
Console.ReadLine();

int i = 0;
foreach (var item in record)

    foreach (var ids in idRecord)
    
        if (item.Id == ids.Id)
        
            i++;
            ids.IsChecked = false; 
            this.model.SaveChanges();
        

    


Console.WriteLine(i);

    

【问题讨论】:

你的方法看起来很合理,有那么慢吗?还是要最小化代码? 如果您按 ID 号排序两个列表,那么您可以使用 for 循环而不是 foreach - 并且不需要从内部循环的开头重新开始。 就个人而言,对于这种批量更新场景,我会编写一个 update SQL 语句,并在两个表之间进行适当的连接,然后运行它。 我假设Ids 是独一无二的,所以你可以放一个break;,这样你就不会遍历不必要的记录。 this.model.SaveChanges() 是做什么的?循环完成后你不能运行一次吗? 【参考方案1】:

EF 没有针对读取和更新数以千计的此类记录进行优化。除其他事项外,您还必须担心对象缓存不断增长、大量网络往返等问题。有一些方法可以对其进行调整,但使用 EF 可能永远无法获得令人满意的性能。

在这些情况下,我认为使用原始 SQL 是合理的,这样您就可以让数据库一次性执行整个操作。如果愿意,您甚至可以将 SQL 包装在存储过程中。

在这种情况下,您可能会编写一个类似这样的 UPDATE 语句:

update a
   set a.IsChecked = 0
  from IdList a
 where a.IsChecked = 1
   and exists (select null
                 from CompReg b
                where b.HtmlRecord is not null
                  and b.Id = a.Id)

如果您至少在CompReg.Id 上定义了一个索引,那么您应该会从中获得非常好的性能。

【讨论】:

我要专注于代码才能想到这一点,谢谢。会试试这个。

以上是关于如何快速比较表格列,2 个表格的主要内容,如果未能解决你的问题,请参考以下文章

如何让Excel自动编号及序号自动填充

excel中如何快速设置每行每列的宽度

如何在MarkDown快速创建表格

使用Excel表格函数进行两列内容快速比对

如何快速批量将多行的内容,变成一行?

如何快速查找两个表格中的重复数据。