检查DataTable中是否存在行?

15
我有一个数据表和一行数据。如果该行数据在数据表中不存在,我想将其导入到数据表中。如何实现这个功能?

2
你在行中有一个键(应该有吗)? - TaW
没有,难道没有像“包含”或“存在”的方法吗? - Curious
1
@TamerMemili 它有Contains,但它只适用于具有PK的表。 - Eugene Podskal
2
我猜你将不得不比较所有的值。 - TaW
是的,我想比较所有的值,但我找不到一个快速简便的方法来做到这一点。 - Curious
8个回答

12

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

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

好的,“LINQ contains method”上面提到的已经是一个方法扩展了。如果您的扩展正在执行一些有用的操作,它可能会为MS实现的扩展添加一些价值。 - S22
我想补充一下,即使您不使用类型化数据集,也必须在表上定义主键。 - Fer R

8

您可以使用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 }

7
如果您想检查 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;
}

6
您可以按以下方式使用 Contains
if(DataTable.Columns.Contains("RowName"))
{
  //Do some stuffs here
}

3

我尝试了这里所有的答案,但都没有成功,所以我自己做了一些东西,在我的情况下可以工作。代码非常简单,它检查您想要添加的行是否已经存在于数据表中 - 如果在数据表中不存在,则添加它。

// 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);
}

0
if ( Datatable1.Rows[NumOfRow].ToString().Deleted == "Deleted")

3
未回答问题。 - Grantly

0

您可以使用任何键值进行检查

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


0

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

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不同。即使相同的DataRaw已经存在于DataTable中,在实际情况下,它们是不同的类实例。通常的.NET相等比较在这种情况下无法正常工作,包括DataTable.Contains(...)方法。
为了正确地检查表格中是否存在DataRaw,应该在表格中搜索给定DataRaw的主键。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接