J'ai un datatable et une rangée. Je souhaite importer la ligne dans la table de données uniquement si elle n'existe pas dans la table de données.
Comment puis je faire ça?
Si vous utilisez un DataSet
, c'est-à-dire déclarée au moment du design, la "méthode linq Contains" prend un DataRow
typé. La valeur par défaut IEqualityComparer
comparera toutes les valeurs de DataRow
. (Ce qui est normalement inutile, car vous devriez avoir une clé définie).
DataSet1 ds = new DataSet1();
DataSet1.DataTable1Row row = ds.DataTable1.AddDataTable1Row(bla, bla);
bool exists = ds.DataTable1.Contains(row);
si vous voulez vérifier tous les cells
dans un DataRow
, vous pouvez essayer cette fonction:
bool ContainDataRowInDataTable(DataTable T,DataRow R)
{
foreach (DataRow item in T.Rows)
{
if (Enumerable.SequenceEqual(item.ItemArray, R.ItemArray))
return true;
}
return false;
}
Vous pouvez utiliser LINQ pour vérifier si la ligne est présente dans la table de données. Suivez cette solution et remplacez "id" par la clé primaire de votre ligne, par laquelle vous pouvez identifier de manière unique une ligne dans une table.
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 }
vous pouvez utiliser Contains
comme ci-dessous
if(DataTable.Columns.Contains("RowName"))
{
//Do some stuffs here
}
J'ai essayé toutes les réponses ici mais n'a pas fonctionné, alors j'ai fait quelque chose pour moi qui fonctionne dans mon cas. Le code est assez simple, il vérifie si la ligne que vous souhaitez ajouter existe déjà dans la table de données - si elle n'existe pas dans la table de données, ajoutez-la.
// 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")
Vous devez vérifier l'existence de lignes en comparant les clés primaires:
static bool RowExists(DataTable table, DataRow row)
{
var pk = table.PrimaryKey
.Select(column => row[column, DataRowVersion.Original])
.ToArray();
return table.Rows.Contains(pk);
}
La raison en est que DataRow
que vous essayez de vérifier par rapport à DataTable
est, dans des scénarios réels, une instance de classe différente par rapport à DataRaw
dans le tableau, même lorsqu'elle est identique DataRaw
existe déjà dans le DataTable
. La comparaison d'égalité .NET habituelle ne fonctionne pas correctement dans ces scénarios. Cela inclut la méthode DataTable.Contains(...)
.
Pour vérifier correctement l'existence de DataRaw
dans la table, la clé primaire donnée DataRaw
doit être recherchée dans la table.