DataRows (LINQ vergelijken met DataSet)
LinQ (Language-Integrated Query) definieert verschillende setoperators om bronelementen te vergelijken om te zien of ze gelijk zijn. LINQ biedt de volgende setoperators:
Deze operators vergelijken bronelementen door de GetHashCode en Equals methoden voor elke verzameling elementen aan te roepen. In het geval van een DataRow, voeren deze operators een verwijzingsvergelijking uit, wat over het algemeen niet het ideale gedrag is voor het instellen van bewerkingen via tabellaire gegevens. Voor setbewerkingen wilt u meestal bepalen of de elementwaarden gelijk zijn en niet de elementverwijzingen. Daarom is de DataRowComparer klasse toegevoegd aan LINQ aan DataSet. Deze klasse kan worden gebruikt om rijwaarden te vergelijken.
De DataRowComparer klasse bevat een waardevergelijkingsemplementatie voor DataRow, zodat deze klasse kan worden gebruikt voor setbewerkingen zoals Distinct. Deze klasse kan niet rechtstreeks worden geïnstantieerd; In plaats daarvan moet de Default eigenschap worden gebruikt om een exemplaar van de DataRowComparer<TRow>. De Equals methode wordt vervolgens aangeroepen en de twee DataRow objecten die moeten worden vergeleken, worden doorgegeven als invoerparameters. De Equals methode retourneert true
als de geordende set kolomwaarden in beide DataRow objecten gelijk is; anders. false
Opmerking
In dit voorbeeld worden Intersect
contactpersonen geretourneerd die in beide tabellen worden weergegeven.
// 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
Opmerking
In het volgende voorbeeld worden twee rijen vergeleken en worden hun hash-codes ophaalt.
' 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))