Markieren Sie das Kontrollkästchen Englisch, um die englische Version dieses Artikels anzuzeigen. Sie können den englischen Text auch in einem Popup-Fenster einblenden, indem Sie den Mauszeiger über den Text bewegen.
Übersetzung
Englisch
Diese Dokumentation wurde archiviert und wird nicht länger gepflegt.

Vergleichen von 'DataRows' (LINQ to DataSet)

Sprachintegrierte Abfrage (Language-Integrated Query, LINQ) definiert verschiedene Mengenoperatoren, um Quellelemente zu vergleichen und zu sehen, ob sie gleich sind. Der LINQ stellt die folgenden Mengenoperatoren bereit:

Diese Operatoren vergleichen Quellelemente, indem sie für jede Auflistung von Elementen die Methoden GetHashCode und Equals aufrufen. Im Falle einer DataRow führen diese Operatoren einen Verweisvergleich aus, was für Mengenoperationen bei tabellarischen Daten im Allgemeinen nicht ideal ist. Bei Mengenoperationen soll in der Regel ermittelt werden, ob die Elementwerte gleich sind, nicht die Elementverweise. Deshalb wurde LINQ to DataSet um die DataRowComparer-Klasse erweitert. Diese Klasse kann verwendet werden, um Zeilenwerte zu vergleichen.

Die DataRowComparer-Klasse enthält eine Wertvergleichimplementierung für DataRow, sodass diese Klasse für Mengenoperationen wie Distinct verwendet werden kann. Diese Klasse kann nicht direkt instanziiert werden. Stattdessen muss die Default-Eigenschaft verwendet werden, damit eine DataRowComparer-Instanz zurückgegeben wird. Dann wird die Equals(DataRow, DataRow)-Methode aufgerufen, und die beiden miteinander zu vergleichenden DataRow-Objekte werden als Eingabeparameter übergeben. Die Equals(DataRow, DataRow)-Methode gibt true zurück, wenn der sortierte Satz von Spaltenwerten in beiden DataRow-Objekten gleich ist. Anderenfalls wird false zurückgegeben.

In diesem Beispiel wird Intersect verwendet, um Kontakte abzurufen, die in beiden Tabellen aufgeführt sind.


// 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"]);
}


Beispiel

Im folgenden Beispiel werden zwei Zeilen miteinander verglichen, und es werden ihre Hashcodes abgerufen.


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



Anzeigen: