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:
Post a Comment