2013-07-03 2 views
0

Итак, у меня есть древовидная структура, некоторые строки которой взяты из 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); 
    } 
} 

}

ответ

1

Простой способ сделать свой словарь из 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]); 
+0

мне нравится это. Благодарю. – Robinson

Смежные вопросы