簡體   English   中英

找到兩個數據表之間的區別

[英]Finding the difference between two DataTables

因此,我有一個樹狀視圖,其中一些行來自DataTable。 提取數據表時,我想使用以下基本規則來更新樹:

  • 刪除樹中存在但在DataTable中沒有對應行的節點
  • 更新樹中存在但需要更新的節點(不同的DateTime)
  • 插入在樹中不存在但在DataTable中存在的節點。

為此,我有一本字典,將Guid(DataTable中的主鍵)散列到樹節點:

Dictionary<Guid, NoteNode> MyHashNoteToNode;

,其中NoteNode從TreeNode派生,並添加了LastEdit DateTime字段。 到目前為止,如此平淡。

為了找到代表樹和數據表之間差異的3組,我編寫了以下代碼。 我很想聽聽有一個非常簡單的Linq查詢,該查詢將返回3組(插入,編輯,刪除),或者一些簡明的查詢將為我完成,也許是我在某處缺少的一種方法。 或者這是最佳選擇?

// Find all items that need inserting.
List<DataRow> toInsert = new List<DataRow>();
foreach (DataRow row in MyNotes.Rows)
{
    NoteNode node = null;
    MyHashNoteToNode.TryGetValue((Guid)row["ID"], out node);
    if(node == null)
    {
        toInsert.Add(row);
    }
}

// Find all items that need editing/changing.
List<DataRow> toEdit = new List<DataRow>();
foreach (DataRow row in MyNotes.Rows)
{
    NoteNode node = null;
    MyHashNoteToNode.TryGetValue((Guid)row["ID"], out node);
    if(node != null)
    {                
        if((DateTime)row["Edited"] != node.LastEdit)
        {
            toEdit.Add(row);
        }
    }
}

// Find all items that need deleting.
List<NoteNode> toDelete = new List<NoteNode>();
foreach (NoteNode node in MyHashNoteToNode.Values)
{
    if (!MyNotes.Rows.Contains(node.Key))
    {
        toDelete.Add(node);
    }
}

}

DataTable制作字典的一種簡單方法是,

DataSet newData;
DataSet existingData;

var before = existingData.AsEnumerable().ToDictionary(
    n => Guid.Parse(n.Field<string>("ID")),
    n => n);

var after = newData.AsEnumerable().ToDictionary(
    n => Guid.Parse(n.Field<string>("ID")),
    n => n);

要找到需要工作的鑰匙,

var keysToInsert = after.Select(p => p.Key).Except(before.Select(p => p.Key));
var keysToDelete = before.Select(p => p.Key).Except(after.Select(p => p.Key));
var keysTheSame = before.Select(p => p.Key).Intersect(after.Select(p => p.Key));

要查找需要工作的行,

var nodesToInsert = keysToInsert.Select(k => after[k]);

var nodesToDelete = keysToDelete.Select(k => before[k]);

var nodesThatNeedUpdates = keysTheSame
    .Where(k => 
        before[k].Field<DateTime>("Edited") !=
        after[k].Field<DateTime>("Edited"))
    .Select(k => after[k]);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM