C# 检查数据表中是否存在行?
我有一个数据表和一行。我只想在datatable中不存在该行时将其导入datatableC# 检查数据表中是否存在行?,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
我该怎么做呢?您可以使用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);
}