只有当主键大于上一个主键时,如何填充DataTable行



问题:在将源DataTable合并到实际DataTable(ActualDT.Merge(SourceDT))时,如果主键大于现有主键,则仅插入行。

我的问题详情如下:

在将JSON反序列化为源数据表之后,我通过API从外部服务器用Int64主键填充实际数据表。然后,我将DataTable中的行写入数据库,并清除DataTable中除最大主键之外的所有行。后来我从API请求新的数据,并且响应通常包含我已经写入数据库的相同行和从DataTable中清除的行。

如果我不清理DataTable行,性能就会下降,这就是内存清理器。所以,我在清洁后留下一排最大的主键。

我不想在合并之前比较源数据表中的每个PrimaryKey,比较可能需要很多时间。

我应该怎么做才能防止合并已经写入数据库并从实际数据表中删除的行?也许我甚至可以在取消序列化过程中排除它们(我使用NewtonSoft JSON.net)?或者如果行的主键<实际数据表中的主键?

谢谢你的回答!

更新:合并代码

public class MyData
{
DataTable BlackPairs = new DataTable();
DataTable WhiteTable = new DataTable();
public string _Json {
set
{
DataSet TempDS = JsonConvert.DeserializeObject<DataSet>(value);
try
{
foreach (DataTable table in TempDS.Tables)
{
BlackPairs = table.Copy();
WhiteTable.Merge(BlackPairs);
}
}catch{}
}
}
public MyData()
{   //columns initialization
WhiteTable.Columns.AddRange(new DataColumn[]{columns);
WhiteTable.PrimaryKey = new DataColumn[]{tid};
}

我已经根据我们通过评论讨论的内容创建了自定义Merge函数。此函数仅适用于主列为typeof(int)的情况,但它可以很容易地进行改进,以获得所有类型,或者只需将其更改为所需的类型(string、int、bool…)

public Test()
{
InitializeComponent();
DataTable smallerDatatable = new DataTable();
smallerDatatable.Columns.Add("Col1", typeof(int));
smallerDatatable.Columns.Add("Col2", typeof(string));
DataTable biggerDatatable = new DataTable();
biggerDatatable.Columns.Add("Col1", typeof(int));
biggerDatatable.Columns.Add("Col2", typeof(string));
smallerDatatable.Rows.Add(1, "Row1");
smallerDatatable.Rows.Add(2, "Row2");
smallerDatatable.Rows.Add(3, "Row3");
biggerDatatable.Rows.Add(1, "Row1");
biggerDatatable.Rows.Add(2, "Row2");
biggerDatatable.Rows.Add(3, "Row3");
biggerDatatable.Rows.Add(4, "Row4");
biggerDatatable.Rows.Add(5, "Row5");
DataTable mergedTable = MergeOnUniqueColumn(smallerDatatable, biggerDatatable, "Col1");
dataGridView1.DataSource = mergedTable;
}
private DataTable MergeOnUniqueColumn(DataTable smallTable, DataTable bigTable, string uniqueColumn)
{
DataTable m = smallTable;
for(int i = 0; i < bigTable.Rows.Count; i++)
{
if(!(smallTable.AsEnumerable().Any(row => bigTable.Rows[i][uniqueColumn].Equals(row.Field<object>(uniqueColumn)))))
{
smallTable.Rows.Add(bigTable.Rows[i].ItemArray);
}
}
return m;
}

上面的函数将从bigTable填充smallTable中每一个缺失的唯一值。

如果只想在最后一行smallTable之后用bigTable中的值填充smallTable,请使用此函数。

private DataTable MergeOnUniqueColumnAfterLastID(DataTable smallTable, DataTable bigTable, string uniqueColumn)
{
DataTable m = smallTable;
int maxUnique = Convert.ToInt32(m.Compute("max([" + uniqueColumn + "])", string.Empty));
for (int i = 0; i < bigTable.Rows.Count; i++)
{
if (!(smallTable.AsEnumerable().Any(row => (int)bigTable.Rows[i][uniqueColumn] <= maxUnique)))
{
smallTable.Rows.Add(bigTable.Rows[i].ItemArray);
}
}
return m;
}

最新更新