LINQ to DataSet

31/03/2008 - 16:30 von Uwe Domschke | Report spam
Leider habe ich bei meinen Recherchen nichts gefunden:
Ich habe ein Dataset mit mehreren Tables dt1, dt2 und Relations dr. Nun
möchte ich aus dt1+dt2, die mit dr verbunden sind, per LINQ meine Daten
abrufen. Ich habe aber nichts gefunden, wie ich unter Nutzung der Relation
dies machen kann. Es gibt Beispiele per join. Das scheitert aber bei mir, da
in dt2 auch Rows enthalten sind, die mit dt1 nichts zu tun haben, d.h. der
key ist null und da steigt das join aus (ist nicht auf meinem Mist
gewachsen). Mit where lassen die sich auch nicht ausblenden.

hat jemand einen Tipp?

Danke

Uwe
 

Lesen sie die antworten

#1 Elmar Boye
31/03/2008 - 18:01 | Warnen spam
Hallo Uwe,

Uwe Domschke schrieb:
Leider habe ich bei meinen Recherchen nichts gefunden:
Ich habe ein Dataset mit mehreren Tables dt1, dt2 und Relations dr. Nun
möchte ich aus dt1+dt2, die mit dr verbunden sind, per LINQ meine Daten
abrufen. Ich habe aber nichts gefunden, wie ich unter Nutzung der
Relation dies machen kann. Es gibt Beispiele per join. Das scheitert
aber bei mir, da in dt2 auch Rows enthalten sind, die mit dt1 nichts zu
tun haben, d.h. der key ist null und da steigt das join aus (ist nicht
auf meinem Mist gewachsen). Mit where lassen die sich auch nicht
ausblenden.



Wenn ich Deine Beschreibung richtig verstanden habe, suchst Du etwas
wie unten im Beispielcode.
Das wesentliche daran ist, bei Spalten, die Nullwerte (DBNull) enthalten
können, einen Nullable Type zu verwenden.

Die Relation ist für die Vergleiche ohne Belang.

Gruß Elmar

///
private void NullableJoin()
{
DataSet dataSet = new DataSet();
DataTable table1 = dataSet.Tables.Add("Tabelle1");
table1.Columns.Add("id", typeof(int));
table1.Columns.Add("Daten", typeof(string));
DataTable table2 = dataSet.Tables.Add("Tabelle2");
table2.Columns.Add("id", typeof(int));
table2.Columns.Add("idTabelle1", typeof(int));
table2.Columns.Add("Daten", typeof(string));

dataSet.Relations.Add("Relation", table1.Columns["id"], table2.Columns["idTabelle1"], false);

table1.Rows.Add(1, "Zeile 1");
table1.Rows.Add(2, "Zeile 2");

table2.Rows.Add(1000, 1, "zu Zeile 1");
table2.Rows.Add(1001, 1, "zu Zeile 1");
table2.Rows.Add(2001, 2, "zu Zeile 2");
table2.Rows.Add(3000, null, "keine Zeile 3");
table2.Rows.Add(4000, -1, "auch keine Zeile 4");
dataSet.AcceptChanges();

var query = from t1 in table1.AsEnumerable()
join t2 in table2.AsEnumerable()
// <int> == <int?> für Null Vergleich
on t1.Field<int>("id") equals t2.Field<int?>("idTabelle1")
select new
{
t1id = t1.Field<int>("id"),
t2id = t2.Field<int>("id"),
t1daten = t1.Field<string>("Daten"),
t2daten = t2.Field<string>("Daten"),
};
foreach (var row in query)
{
Console.WriteLine("{0}\t{1}\t{2:d}\t{3}",
row.t1id, row.t2id, row.t1daten, row.t2daten);
}
}
\\\

Ähnliche fragen