Итак, у меня есть древовидная структура, некоторые строки которой взяты из DataTable. Когда я выборки данных таблицы, я хочу, чтобы обновить дерево со следующими основными правилами:Поиск разницы между двумя таблицами данных
- удалять узлы, которые существуют в дереве, но без соответствующей строки в DataTable
- узлов обновления, которые существуют в но нужно обновление (другое время)
- Вставьте узлы, которые не существуют в дереве , но делают это в DataTable.
С этой целью у меня есть словарь, хэширования Guid (первичный ключ в DataTable), расположенный в узле дерева:
Dictionary<Guid, NoteNode> MyHashNoteToNode;
, где NoteNode является производным от TreeNode, с добавлением LastEdit Поле DateTime. Пока что так банально.
Чтобы найти 3 набора, представляющих разницу между деревом и DataTable, я написал код ниже. Мне бы очень хотелось услышать, что есть действительно простой запрос Linq, который вернет 3 набора (Insert, Edit, Delete) или что-то краткое, что сделает это для меня, возможно, метод, который я где-то отсутствует. Или это довольно оптимально?
// 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);
}
}
}
мне нравится это. Благодарю. – Robinson