[英]Check if row exists in 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
应搜索在表中。
您可以检查使用 any 与键值
If (value.Tables(0).AsEnumerable().Any(Function(x) key = x.Field(Of Integer)("ProductId")))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.