2010-01-09 27 views
5

Tôi có hai datatables (A, B) với cùng cấu trúc. Tôi cần phải so sánh mỗi hàng của A với hàng của B và kết quả Datatable C nên có hàng trong A và những thay đổi của hàng đó trong B bên dưới nó. Đối với các hàng giống hệt nhau (các giá trị giống nhau trong A & B) kết quả có thể định vị không được có các hàng này.So sánh Datatables & Hợp nhất Thay đổi

Vì vậy, kết quả có thể định vị sẽ có mỗi hàng trong A và hàng không giống hệt của nó trong B bên dưới. Bảng kết quả không được có các hàng giống hệt nhau.

Bất kỳ ai cũng có thể giúp tôi với mã C#.

+0

Bạn có cần làm điều đó trong C# hoặc bạn có thể sử dụng công cụ này không? –

Trả lời

1

cách dễ nhất là một liên minh xuyên cơ sở dữ liệu:

create table merged 
(select * from db1.t) union (select * from db2.t) 

hàng chỉ độc đáo được trả về. để so sánh các bản ghi, hãy chọn các hàng chia sẻ cùng một khóa (cột khóa được hợp nhất sẽ không phải là duy nhất).

select * from merged order by key 

đặt hàng các kết quả theo thứ tự bạn muốn.

select * from merged where key in 
(select key from merged group by key having count(*) > 1) 
order by key 

sẽ chỉ trả lại các hàng không khớp.

+0

Vì cả hai datatables là từ cơ sở dữ liệu khác nhau, tôi không thể sử dụng truy vấn Sql hoặc Oracle cho một liên minh cơ sở dữ liệu chéo. Có cách nào để đạt được điều này trong C# .net ?? – vinodreddymk

+0

một cách là để đổ dữ liệu vào csv và nhập nó, sẽ là nhanh nhất để cho sql làm so sánh – jspcal

+0

Chúng ta không thể so sánh trực tiếp 2 datatables và nhận được kết quả mong muốn thay vì đổ dữ liệu vào một csv ?? – vinodreddymk

1

Có vẻ như bạn muốn tính symmetric difference của hai DataSets. Chúng ta có thể làm điều này bằng cách sử dụng một chút LINQ, một trình so sánh bình đẳng và một vài phương thức mở rộng. Mã được kiểm tra và làm việc.

class Program 
{ 
    static void Main() 
    { 
     var a = new DataTable {Columns = {{"FirstName", typeof (string)}, {"Age", typeof (int)}}, Rows = {{"Alice", 31}, {"Bob", 42}}}; 
     var b = new DataTable {Columns = {{"FirstName", typeof (string)}, {"Age", typeof (int)}}, Rows = {{"Alice", 31}, {"Carol", 53}}}; 
     var diffs = a.SymmetricDifference(b); 
     Console.Write(diffs.Rows.Count); 
    } 
} 

public static class DataTableExtensions 
{ 
    public static DataTable SymmetricDifference(this DataTable a, DataTable b) 
    { 
     var diff = a.Clone(); 
     foreach (var person in a.AsPersonList().SymmetricDifference(b.AsPersonList())) 
     { 
      diff.Rows.Add(person.FirstName, person.Age); 
     } 

     return diff; 
    } 

    private static IEnumerable<Person> SymmetricDifference(this IEnumerable<Person> a, IEnumerable<Person> b) 
    { 
     return a.SymmetricDifference(b, new PersonComparer()); 
    } 

    private static IEnumerable<T> SymmetricDifference<T>(this IEnumerable<T> a, IEnumerable<T> b, IEqualityComparer<T> comparer) 
    { 
     return a.Except(b, comparer).Concat(b.Except(a, comparer)); 
    } 

    private static IEnumerable<Person> AsPersonList(this DataTable table) 
    { 
     return table.AsEnumerable().Select(row => row.AsPerson()).ToList(); 
    } 

    private static Person AsPerson(this DataRow row) 
    { 
     return new Person 
        { 
         FirstName = row.Field<string>("FirstName"), 
         Age = row.Field<int>("Age") 
        }; 
    } 
} 

public class PersonComparer : IEqualityComparer<Person> 
{ 
    public bool Equals(Person a, Person b) 
    { 
     return a.FirstName == b.FirstName && a.Age == b.Age; 
    } 

    public int GetHashCode(Person item) 
    { 
     return StringComparer.InvariantCultureIgnoreCase.GetHashCode(item.FirstName) 
       + StringComparer.InvariantCultureIgnoreCase.GetHashCode(item.Age); 
    } 
} 

public class Person 
{ 
    public string FirstName; 
    public int Age; 
} 
Các vấn đề liên quan