2008-01-23

Abfragen der Daten mit LINQ to DataSet

Nach dem die Daten aus der Datenbank ermittelt und in ein DataSet-Objekt geladen sind, können diese Daten mit LINQ-Abfragen ausgewertet werden. Für die LINQ-Abfrage stehen die Standard Query Operatoren zur Verfügung. Auch beim Abfragen der Daten gibt es unterschiede, ob ein typisiertes oder untypisiertes DataSet als Datenquelle verwendet wird.

Die AsEnumerable-Methode wird bei einem DataTable-Objekt eines untypisierten DataSet-Objektes verwendet, um das DataTable-Objekt LINQ fähig zu machen. Die Methode Field<T> kommt beim untypisierten DataSet-Objekten aus ins Spiel, wenn der Wert eines Feldes ermittelt oder mit einem anderen Wert verglichen wird.

Der folgende Beispielcode zeigt, wie ein untypisiertes DataSet mithilfe einer LINQ-Abfrage gefiltert werden kann:

private void btnFilterUntyped_Click(object sender, EventArgs e)
{
string selectSql = @"SELECT [Person].[CountryRegion].[CountryRegionCode],
[Person].[CountryRegion].[Name],
[Person].[CountryRegion].[ModifiedDate]
FROM [Person].[CountryRegion]
";

SqlConnection sqlCon
= new SqlConnection(@"Data Source=.;
Initial Catalog=AdventureWorks;
Integrated Security=True
");

SqlDataAdapter sqlDa
= new SqlDataAdapter();
sqlDa.SelectCommand
= new SqlCommand(selectSql, sqlCon);

DataSet adventureWorksDS
= new DataSet("AdventureWorks");
sqlDa.Fill(adventureWorksDS,
"CountryRegion");

var qry
= from cr
in adventureWorksDS.Tables["CountryRegion"].AsEnumerable()
where cr.Field<string>("CountryRegionCode") == "CH"
select cr;

this.dgvLinqToDataSet.DataSource = qry.CopyToDataTable();
}

Die Datenquelle CountryRegion DataTable-Objekt wird mit der AsEnumerable Methode LINQ fähig gemacht.


var qry = from cr in adventureWorksDS.Tables["CountryRegion"].AsEnumerable()

Die Field<T>-Methode ermittelt den Wert des Feldes und hilft das DBNull.Value-Problem zu lösen. Wenn ein Feld in der Datenbank den Null-Wert besitzt, liefert das Feld eines DataTable-Objektes einen DBNull.Value-Wert zurück. Dieser DBNull.Value-Wert entspricht nicht dem Null-Wert des .NET Frameworks und muss speziell behandelt werden. Mit der Field<T>-Methode wird sichergestellt, dass ein DBNull.Value in einen Null-Wert umgewandelt wird.


where cr.Field<string>("CountryRegionCode") == "CH"

Die Auswertung vom typisierten DataSet-Objekt ist einfacher, weil das DataTable-Objekt bereits den IEnumerable<T>-Interface implementiert hat und die Felder direkt ansprechbar sind. In diesem Fall benötigen wir die Methoden AsEnumerable und Field nicht, wie der untenstehende Beispielcode das auch zeigt:


private void btnFilterTyped_Click(object sender, EventArgs e)
{
string selectSql = @"SELECT [Person].[CountryRegion].[CountryRegionCode],
[Person].[CountryRegion].[Name],
[Person].[CountryRegion].[ModifiedDate]
FROM [Person].[CountryRegion]
";

SqlConnection sqlCon
= new SqlConnection(@"Data Source=.;
Initial Catalog=AdventureWorks;
Integrated Security=True
");

SqlDataAdapter sqlDa
= new SqlDataAdapter();
sqlDa.SelectCommand
= new SqlCommand(selectSql, sqlCon);

AdventureWorksTypedDS adventureWorksDS
= new AdventureWorksTypedDS();
sqlDa.Fill(adventureWorksDS.CountryRegion);

var qry
= from cr in adventureWorksDS.CountryRegion
where cr.CountryRegionCode == "CH"
select cr;

this.dgvLinqToDataSet.DataSource = qry;
}


Die Unterschiede der beiden oben beschrieben Abfragen sind in der untenstehenden Tabelle hervorgehoben, damit die Schreibweisen vergleichbar sind.

Untypisiertes DataSet-Objekt


var qry = from cr in adventureWorksDS.Tables["CountryRegion"].AsEnumerable()

where cr.Field<string>("CountryRegionCode") == "CH"

select cr;

this.dgvLinqToDataSet.DataSource = qry.CopyToDataTable();

Typisiertes DataSet-Objekt


var qry = from cr in adventureWorksDS.CountryRegion

where cr.CountryRegionCode == "CH"

select cr;

No comments: