Aracılığıyla paylaş


DataRows Karşılaştırma (LINQ to DataSet)

DilLe Tümleşik Sorgu (LINQ), kaynak öğeleri karşılaştırarak eşit olup olmadığını görmek için çeşitli küme işleçleri tanımlar. LINQ aşağıdaki küme işleçlerini sağlar:

Bu işleçler, her öğe koleksiyonunda GetHashCode ve Equals yöntemlerini çağırarak kaynak öğeleri karşılaştırır. durumunda DataRow, bu işleçler bir başvuru karşılaştırması gerçekleştirir ve bu genellikle tablosal veriler üzerinde işlemleri ayarlamak için ideal bir davranış değildir. Ayarlama işlemleri için genellikle öğe başvurularının değil, öğe değerlerinin eşit olup olmadığını belirlemek istersiniz. Bu nedenle, DataRowComparer sınıfı LINQ to DataSet'e eklenmiştir. Bu sınıf, satır değerlerini karşılaştırmak için kullanılabilir.

sınıfı DataRowComparer için bir değer karşılaştırma uygulaması içerdiğinden DataRow, bu sınıf gibi Distinctküme işlemleri için kullanılabilir. Bu sınıf doğrudan örneklenemez; bunun yerine, özelliğinin Default bir örneğini döndürmek DataRowComparer<TRow>için kullanılması gerekir. Yöntemi Equals daha sonra çağrılır ve karşılaştırılacak iki DataRow nesne giriş parametresi olarak geçirilir. yöntemi, Equals her iki DataRow nesnedeki sıralı sütun değerleri kümesi eşitse, aksi takdirde döndürür truefalse.

Örnek

Bu örnek, her iki tabloda da görünen kişileri döndürmek için kullanır Intersect .

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

Örnek

Aşağıdaki örnek iki satırı karşılaştırır ve karma kodlarını alır.

' 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))

Ayrıca bkz.