2013-07-03 6 views
0

그래서 일부보기는 DataTable에서 오는 트리보기가 있습니다. 나는 데이터 테이블을 가져올 때, 나는 다음과 같은 기본 규칙 트리를 업데이트 할 다음에 존재하는 트리에 있지만 DataTable을 두 DataTable의 차이 찾기

  • 업데이트 노드에 대응하는 행 없이 존재

    • 제거 노드를 트리가 필요하지만 업데이트 (다른 ​​DateTime)
    • 트리에는 없지만 DataTable에는 노드를 삽입하십시오. LastEdit의 추가,

      Dictionary<Guid, NoteNode> MyHashNoteToNode; 
      

      , NoteNode가 TreeNode를으로부터 유도된다 : 트리 노드는 GUID (DataTable에있는 기본 키) 해싱 I는 사전이이를 위해

    , DateTime 필드. 지금까지 너무 진부합니다.

    트리와 DataTable의 차이를 나타내는 3 세트를 찾으려면 아래 코드를 작성하십시오. 나는 3 세트 (Insert, Edit, Delete)를 반환 할 정말 간단한 Linq 쿼리가 있다는 것을 듣고 싶다. 아니면 어딘가에서 누락 된 메소드 일 것이다. 아니면 꽤 최적입니까?

    // 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