Bagikan melalui


Membandingkan DataRows (LINQ ke DataSet)

Language-Integrated Query (LINQ) menentukan berbagai operator set untuk membandingkan elemen sumber guna melihat apakah elemen sumber sama. LINQ menyediakan operator set berikut:

Operator ini membandingkan elemen sumber dengan memanggil metode GetHashCode dan Equals pada setiap kumpulan elemen. Dalam kasus DataRow, operator ini melakukan perbandingan referensi, yang umumnya bukan perilaku ideal untuk operasi set pada data bertabel. Untuk operasi set, Anda biasanya ingin menentukan apakah nilai elemen sama dan bukan referensi elemen. Oleh karena itu, kelas DataRowComparer telah ditambahkan ke LINQ ke DataSet. Kelas ini dapat digunakan untuk membandingkan nilai baris.

Kelas DataRowComparer berisi penerapan perbandingan nilai untuk DataRow, sehingga kelas ini dapat digunakan untuk operasi set seperti Distinct. Kelas ini tidak dapat dibuat secara langsung; sebagai gantinya, properti Default harus digunakan untuk mengembalikan instans DataRowComparer<TRow>. Metode Equals kemudian dipanggil dan dua objek DataRow yang akan dibandingkan diteruskan sebagai parameter input. Metode Equals mengembalikan true jika kumpulan nilai kolom yang diurutkan di kedua objek DataRow sama; jika tidak, false.

Contoh

Contoh ini menggunakan Intersect untuk mengembalikan kontak yang muncul di kedua tabel.

// Fill the DataSet.
DataSet ds = new DataSet();
ds.Locale = CultureInfo.InvariantCulture;
FillDataSet(ds);

DataTable contactTable = ds.Tables["Contact"];

// Create two tables.
IEnumerable<DataRow> query1 = from contact in contactTable.AsEnumerable()
                              where contact.Field<string>("Title") == "Ms."
                              select contact;

IEnumerable<DataRow> query2 = from contact in contactTable.AsEnumerable()
                              where contact.Field<string>("FirstName") == "Sandra"
                              select contact;

DataTable contacts1 = query1.CopyToDataTable();
DataTable contacts2 = query2.CopyToDataTable();

// Find the intersection of the two tables.
var contacts = contacts1.AsEnumerable().Intersect(contacts2.AsEnumerable(),
                                                    DataRowComparer.Default);

Console.WriteLine("Intersection of contacts tables");
foreach (DataRow row in contacts)
{
    Console.WriteLine("Id: {0} {1} {2} {3}",
        row["ContactID"], row["Title"], row["FirstName"], row["LastName"]);
}
' Fill the DataSet.
Dim ds As New DataSet()
ds.Locale = CultureInfo.InvariantCulture
' See the FillDataSet method in the Loading Data Into a DataSet topic.
FillDataSet(ds)

Dim contactTable As DataTable = ds.Tables("Contact")

Dim query1 = _
    From contact In contactTable.AsEnumerable() _
    Where contact.Field(Of String)("Title") = "Ms." _
    Select contact

Dim query2 = _
    From contact In contactTable.AsEnumerable() _
    Where contact.Field(Of String)("FirstName") = "Sandra" _
    Select contact

Dim contacts1 = query1.CopyToDataTable()
Dim contacts2 = query2.CopyToDataTable()

Dim contacts = contacts1.AsEnumerable() _
    .Intersect(contacts2.AsEnumerable(), DataRowComparer.Default)

Console.WriteLine("Intersect of employees tables")

For Each row In contacts
    Console.WriteLine("Id: {0} {1} {2} {3}", _
            row("ContactID"), row("Title"), row("FirstName"), row("LastName"))
Next

Contoh

Contoh berikut membandingkan dua baris dan mendapatkan hash baris.

' Fill the DataSet.
Dim ds As New DataSet()
ds.Locale = CultureInfo.InvariantCulture
' See the FillDataSet method in the Loading Data Into a DataSet topic.
FillDataSet(ds)

' Get two rows from the SalesOrderHeader table.
Dim table As DataTable = ds.Tables("SalesOrderHeader")
Dim left = table.Rows(0)
Dim right = table.Rows(1)

' Compare the two different rows.
Dim comparer As IEqualityComparer(Of DataRow) = DataRowComparer.Default
Dim bEqual = comparer.Equals(left, right)

If (bEqual = True) Then
    Console.WriteLine("Two rows are equal")
Else
    Console.WriteLine("Two rows are not equal")
End If

' Output the hash codes of the two rows.
Console.WriteLine("The hashcodes for the two rows are {0}, {1}", _
    comparer.GetHashCode(left), _
    comparer.GetHashCode(right))

Lihat juga