2008-01-20

Auffüllen eines DataSets mit LINQ to SQL

LINQ to SQL ermöglicht die Ermittlung der Daten aus einem SQL Server. Mit LINQ to SQL sind keine SQL-Anweisungen im Programmcode nötig, um die Daten aus der Datenbank ermitteln zu können. Die nötigen SQL-Anweisungen werden im Hintergrund generiert und die Daten werden mithilfe dieser Anweisungen aus der Datenbank ermittelt. Die aus der Datenbank ermittelte Daten stehen als Resultat der LINQ to SQL-Abfrage für die Weiterverwendung zur Verfügung.

Das Resultat der LINQ to SQL-Abfrage kann nicht direkt in ein DataSet-Objekt weitergegeben werden. LINQ bietet keine Methode für die Weitergabe vom Resultat einer LINQ-Abfrage in ein DataSet-Objekt. Die LoadDataRow-Methode der DataTable-Klasse kann für das Transferieren einer LINQ-Abfrage Resultates in ein DataTable-Objekt verwendet werden.

In dem folgenden Beispielcode wird gezeigt, wie die LoadDataRow-Methode das Resultat einer LINQ-Abfrage in ein DataTable-Objekt weitergibt.

private void btnLoadWithLinqToSql_Click(object sender, EventArgs e)
{
AdventureWorksDataContext db
= new AdventureWorksDataContext();
var qry
= from cr in db.CountryRegions
select cr;

this._AdventureWorksDS = new DataSet("AdventureWorks");

DataTable countryRegionDT
= new DataTable("CountryRegion");
countryRegionDT.Columns.Add(
"CountryRegionCode", typeof(string));
countryRegionDT.Columns.Add(
"Name", typeof(string));
countryRegionDT.Columns.Add(
"ModifiedDate", typeof(DateTime));

foreach(var cr in qry)
{
countryRegionDT.LoadDataRow(
new Object[] {cr.CountryRegionCode,
cr.Name,
cr.ModifiedDate},
true);
}


this._AdventureWorksDS.Tables.Add(countryRegionDT);

this.dgvLinqToSql.DataSource = this._AdventureWorksDS.Tables["CountryRegion"];
}

Die wichtigsten Zeilen im obigen Beispielcode sind die foreach-Schleife und der Aufruf der LoadDataRow-Methode. Mit der foreach-Schleife werden die einzelnen Entity-Objekten gelesen und mithilfe der LoadDataRow-Methode werden die einzelnen Eigenschaften dieser Objekte an das DataTable-Objekt weitergegeben.


foreach(var cr in qry)
{
countryRegionDT.LoadDataRow(
new Object[] {cr.CountryRegionCode,
cr.Name,
cr.ModifiedDate},
true);
}

Wenn ein typisiertes DataSet verwendet wird, steht unter der DataTable-Klasse eine Methode zum Hinzufügen eines Row-Objektes zur Verfügung. In dem Beispiel wird die AddCountryRegion-Methode aufgerufen und die einzelnen Eigenschaften des Entity-Objekts übergeben:


AdventureWorksDataContext db = new AdventureWorksDataContext();
var qry
= from cr in db.CountryRegions
select cr;

AdventureWorksTypedDS ds
= new AdventureWorksTypedDS();

foreach (var cr in qry)
{
ds.CountryRegion.AddCountryRegionRow(cr.CountryRegionCode,
cr.Name,
cr.ModifiedDate);
}

this.dgvLinqToSql.DataSource = ds.CountryRegion;

No comments: