C# 检查数据表中是否存在行?

C# 检查数据表中是否存在行?,c#,datatable,datarow,C#,Datatable,Datarow,我有一个数据表和一行。我只想在datatable中不存在该行时将其导入datatable 我该怎么做呢?您可以使用LINQ检查数据表中是否存在行。按照这个解决方案,用行的主键替换“id”,通过主键可以唯一地标识表中的行 DataRow dr = null; // assign your DR here DataTable dt = new DataTable(); // assign Datatable instance here. var k = (from r in dt.Rows.OfTy

我有一个数据表和一行。我只想在datatable中不存在该行时将其导入datatable


我该怎么做呢?

您可以使用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 dr=null;//在此处指定您的DR
DataTable dt=新DataTable();//在此处分配Datatable实例。
变量k=(从类型()的dt.Rows.OfType()中的r开始,其中r[“id”]。ToString()==dr[“id”]。ToString()选择r)。FirstOrDefault();
如果(k!=null)
{//行存在}

如果要检查
数据行中的所有
单元格
,可以尝试此功能:

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

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


您可以使用
包含
,如下所示

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

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

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
不同,即使
DataTable
中已经存在相同的
DataRaw
。在这种情况下,通常的.NET相等性比较无法正常工作。它包括
DataTable.Contains(…)
方法


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

在此处尝试了所有答案,但均无效,因此我为自己制作了一些在我的情况下有效的东西。代码非常简单,它检查要添加的行是否已经存在于datatable中——如果它不存在于datatable中,请添加它

// 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);
}
//用信息填充dt
DataTable dt=新的DataTable();
//创建新行并用信息填充它
DataRow dr=dt.NewRow();
//明显的
bool isDistinct=true;
对于(int i=0;i
您可以使用任意键值进行检查


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

行中是否有键(如您所应的)?不,我没有,是否有类似“contains”或“exists”的方法?@TamerMemili它有,但这只适用于有PK的表。我猜您必须比较所有值,我想比较所有的值,但是我找不到一个快速简单的方法来做。如果不能解决这个问题,那么上面提到的“LINQ contains方法”已经是一个方法扩展。如果您的扩展正在做一些有用的事情,它可能会为由MS实现的扩展增加一些价值。。即使不使用类型化数据集,也必须在表上定义主键。
static bool RowExists(DataTable table, DataRow row)
{
    var pk = table.PrimaryKey
                .Select(column => row[column, DataRowVersion.Original])
                .ToArray();

    return table.Rows.Contains(pk);
}
// 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);
}