【问题标题】:Check if row exists in DataTable?检查数据表中是否存在行?
【发布时间】:2014-09-28 18:18:55
【问题描述】:

我有一个数据表和一行。仅当数据表中不存在该行时,我才想将该行导入数据表。

我该怎么做?

【问题讨论】:

  • 行中是否有键(应该如此)?
  • 不,我没有,不是有“包含”或“存在”之类的方法吗?
  • @TamerMemili 它有 Contains,但这仅适用于有 PK 的表。
  • 我猜你必须比较所有的值
  • 是的,我想比较所有值,但我找不到快速简便的方法

标签: c# datatable datarow


【解决方案1】:

如果您使用键入的 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包含方法”已经是方法扩展了。如果您的扩展程序正在做一些有用的事情,它可能会为 MS 实施的扩展程序增加一些价值。
  • 我要补充.. 即使您不使用类型化数据集,您也必须在表上定义主键。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    如果你想查看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;
    }
    

    【讨论】:

      【解决方案4】:

      您可以使用Contains,如下所示

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

      【讨论】:

        【解决方案5】:

        在这里尝试了所有答案但没有奏效,所以我为自己做了一些适合我的情况。代码很简单,它检查你要添加的行是否已经存在于数据表中——如果它不存在于数据表中,就添加它。

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

        【讨论】:

          【解决方案6】:
          if ( Datatable1.Rows[NumOfRow].ToString().Deleted == "Deleted")
          

          【讨论】:

          • 没有解决问题
          【解决方案7】:

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

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

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

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

          【讨论】:

            【解决方案8】:

            您可以检查使用任何键值

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

            【讨论】:

              猜你喜欢
              • 2012-05-29
              • 1970-01-01
              • 1970-01-01
              • 2015-11-16
              • 1970-01-01
              • 2021-05-24
              • 2019-08-16
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多