如何查找数据表的NOT

本文关键字:数据表 NOT 查找 何查找 | 更新日期: 2023-09-27 18:19:19

我有两个数据表,例如,dt1dt2.Dt1包含所有国家列表,dt2包含少数国家列表。我需要一个数据表dt3,它应该包含所有国家,除了dt2中的国家列表。

如何查找数据表的NOT

使用Enumerable。Except(IEnumerable, IEnumerable) Method:

DataTable onlyInFirstTable = dt1.AsEnumerable().Except(dt2.AsEnumerable()).CopyToDataTable();

要使用Except,您需要使用接受IEqualityComparer<DataRow>的重载,因为默认比较器将返回dt1中的所有行,因为它们与dt2中的DataRow s不同。

例如,使用这个简单的实现(您应该添加错误处理):
public class CountryRowComparer : IEqualityComparer<DataRow>
{
    public bool Equals(DataRow r1, DataRow r2)
    {
        return r1["Country"] == r2["Country"];
    }
    public int GetHashCode(DataRow r)
    {       
        return r["Country"].GetHashCode();
    }
}

您可以获得dt1中不在dt2中的国家,如下所示:

var dt3 = dt1.AsEnumerable().Except(dt2.AsEnumerable(), new CountryRowComparer()).CopyToDataTable();

如果您不想为此而创建IEqualityComparer类,另一种获取dt1中不在dt2中的国家的方法是:

var exclude = dt2.AsEnumerable()
                 .Select(r => r.Field<string>("Country"));
var dt3 = dt1.AsEnumerable()
             .Where(r => !exclude.Contains(r.Field<string>("Country")))
             .CopyToDataTable();