检查DataTable中是否存在行

本文关键字:存在 是否 DataTable 检查 | 更新日期: 2023-09-27 18:25:01

我有一个数据表和一行。只有当数据表中不存在该行时,我才希望将其导入数据表。

我该怎么做?

检查DataTable中是否存在行

如果使用类型化的DataSet,即在设计时声明的,则"linq Contains方法"将使用类型化DataRow。默认的IEqualityComparer将比较DataRow中的所有值。(这通常是无用的,因为您应该定义一个键)。

DataSet1 ds = new DataSet1();
DataSet1.DataTable1Row row = ds.DataTable1.AddDataTable1Row(bla, bla);
bool exists = ds.DataTable1.Contains(row);

您可以使用LINQ检查数据表中是否存在行。按照这个解决方案,将"id"替换为行的主键,通过主键可以唯一标识表中的行。

DataRow dr = null; // assign your DR here
DataTable dt = new DataTable(); // assign Datatable instance here.
var k = (from r in dt.Rows.OfType<DataRow>()  where r["id"].ToString() == dr["id"].ToString() select r).FirstOrDefault();
if(k != null)
{  // Row is present }

如果您想检查DataRow中的所有cells,您可以尝试以下功能:

bool ContainDataRowInDataTable(DataTable T,DataRow R)
{
    foreach (DataRow item in T.Rows)
    {
        if (Enumerable.SequenceEqual(item.ItemArray, R.ItemArray))
            return true;
    }
    return false;
}

您可以使用Contains,如下所示

if(DataTable.Columns.Contains("RowName"))
{
  //Do some stuffs here
}

在这里尝试了所有答案,但没有成功,所以我为自己做了一些适合我的东西。代码非常简单,它检查要添加的行是否已经存在于数据表中——如果它不存在于数据中,则添加它。

// fill dt with information
DataTable dt = new DataTable();
// create a new row and fill it with information
DataRow dr = dt.NewRow();
// distinct
bool isDistinct = true;
for (int i=0; i < dt.Rows.Count; i++)
{
  // check if both rows are equal
  if (Enumerable.SequenceEqual(dt.Rows[i].ItemArray, dr.ItemArray))
  {
    // it already exists
    isDistinct = false;
    break;
  }
}
if (isDistinct)
{
  dt.Rows.Add(dr);
}
if ( Datatable1.Rows[NumOfRow].ToString().Deleted == "Deleted")

您应该通过比较主键来检查行是否存在:

static bool RowExists(DataTable table, DataRow row)
{
    var pk = table.PrimaryKey
                .Select(column => row[column, DataRowVersion.Original])
                .ToArray();
    return table.Rows.Contains(pk);
}

原因是,在实际场景中,您试图对照现有DataTable检查的DataRow与表中的DataRaw相比是不同的类实例,即使DataTable中已经存在相同的DataRaw。在这种情况下,通常的.NET相等性比较无法正常工作。其中包括DataTable.Contains(...)方法。

为了正确检查表中是否存在DataRaw,应在表中搜索给定DataRaw的主键。

您可以使用键值为的任意值进行检查

如果(value.Tables(0).AsEnumerable().Any(Function(x)key=x.Field(Of Integer)("ProductId"))