Entwickler-Ecke
Datenbanken (inkl. ADO.NET) - Linq mit GROUP und DBNull
flyhigh83 - Fr 04.02.11 15:55
Titel: Linq mit GROUP und DBNull
Hallo,
ich hatte vor 2 Tagen schon mal ein Problem mit DBNull Werten gestellt. Da ich mich gerade versuche durch das große Netz von Linq to SQL durchzuwurschtel, treffe ich immer wieder auf Probleme. Damit mein Programm keine Fehler ausspuckt muss ich abfragen ob die Spalte auch kein DBNull Wert hat, da dieser in der Spalte vorkommen kann.
Ich habe hier eine funktionierende Abfrage.
C#-Quelltext
1: 2: 3: 4:
| var Test1 = from table1 in dbDataSet.table1 join table2 in dbDataSet.table2 on table1.idTable2 equals table2.id where table1.idTable2 == 1 select table1.Ortsteil = table1 == null ? null : (table1.IsOrtsteilNull() ? null : table1.Ortsteil); |
Dann habe versuche ich gerade eine GROUB Klause mit einzubauen. Jetzt kommt das Problem, wie ich jetzt genau die DBNull werte abfangen kann, da ich noch eine zweite Spalte auswählen will. Die Groupanweisung funktioniert. Doch habe ich versucht jetzt die DBNull anweisung an verschiedenen stellen zu implementieren. Allerdings bekomme ich das überhaupt nicht hin. Und habe auch bisher nichts darüber gefunden.
C#-Quelltext
1: 2: 3: 4: 5:
| var Test1 = from table1 in dbDataSet.table1 join table2 in dbDataSet.table2 on table1.idTable2 equals table2.id where table1.idTable2 == 1 group table1 by new { table1.Ort, table1.Ortsteil } into TestOrt select TestOrt.Key.ToString(); |
Wo kann ich dazu etwas nachlesen, beziehungsweise wer kann mir hier hilfestellung geben?
Dank
Trashkid2000 - Fr 04.02.11 16:56
Hallo,
wenn Du die Methoden zur Prüfung auf DBNull verwendest könnte das Ganze dann so aussehen (wenn ich die Methoden richtig benamst habe):
C#-Quelltext
1: 2: 3: 4: 5:
| var Test1 = from table1 in dbDataSet.table1 join table2 in dbDataSet.table2 on table1.idTable2 equals table2.id where table1.idTable2 == 1 group table1 by new { Ort = table1.IsOrtNull() ? "ist null" : table1.Ort, Ortsteil = table1.IsOrtsteilNull() ? "ist null" : table1.Ortsteil } into TestOrt select TestOrt.Key.ToString(); |
101 LinQ-Beispiele kannst Du Dir unter
http://msdn.microsoft.com/en-us/vcsharp/aa336746 anschauen.
LG, Marko
flyhigh83 - Fr 04.02.11 17:18
Danke
das gleiche habe ich auch so hibekommen. Versuche jetzt nur auf die einzelnen Datensätze noch zuzugreifen von der Abfrage, da ich jeweils einen String brauche
sollte dann so ungefähr aussehen "Ort - Ortsteil"
in der Foreach schleife schau ich dann ob es einen Ortsteil dazu gibt zu dem Ort sonst schreibe ich nur "Ort"
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| var test = from table in dbDataSet.table1 join table2 in dbDataSet.table2 on table1.idTable2 equals table2.id where table1.idTable2 == 1 group table1 by new { Ort = (string)table1.Ort, Ortsteil = table1 == null ? null : (table1.IsOrtsteilNull() ? null : table1.Ortsteil) } into TestOrt select TestOrt.Key.ToString(); |
Danke mal für deine Mühe. Vielleicht bekomme ich das ja noch in den nächsten Minuten hin. :-)
Ach ja die Seite kenne ich, habe mir davon auch einiges zusammengebaut um es besser zu verstehen. Solangsam wird es. Übung macht den Meister :-)
Hihi,
Nachtrag!
C#-Quelltext
1: 2: 3: 4:
| select new { Ort = TestOrt.Key.Ort.ToString(), Ortsteil = TestOrt.Key.Ortsteil.ToString() }; |
flyhigh83 - Fr 04.02.11 17:27
Ok ich glaube ich habe es soweit, jetzt nur mal noch eine Frage.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| var test = from table in dbDataSet.table1 join table2 in dbDataSet.table2 on table1.idTable2 equals table2.id where table1.idTable2 == 1 group table1 by new { Ort = (string)table1.Ort, Ortsteil = table1 == null ? null : (table1.IsOrtsteilNull() ? null : table1.Ortsteil) } into TestOrt select new { Ort = TestOrt.Key.Ort.ToString(), Ortsteil = TestOrt.Key.Ortsteil.ToString() };
string Orteauflisten = ""; foreach (var Ort in ContainerOrteVereine) { Orteauflisten += Ort.Ort + "-" + Ort.Ortsteil + ", "; } |
nachdem er das erste Element schreiben will und sich das zweite holt erhalte ich einen Fehler auf Objektinstanz fehlt. Muss ich mir erst eine Klasse anlegen und die dann als "select new Klasse {...}" angeben? oder warum kommt das.
Trashkid2000 - Fr 04.02.11 17:49
Ich denke, es liegt daran:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7:
| ... select new { Ort = TestOrt.Key.Ort.ToString(), Ortsteil = TestOrt.Key.Ortsteil.ToString() }; ... |
Denn wenn der Ortsteil in der Row DBNull ist, so ist er an diesem Punkt
null. Und wenn Du dann
Ortsteil = TestOrt.Key.Ortsteil.ToString() sagst, knallt es halt. Aber verstehe auch nicht so ganz, warum Du das
select new nochmal machst. Das ToString kannst Du doch auch schon davor machen.
Kha - Sa 05.02.11 00:29
Nebenbei:
flyhigh83 hat folgendes geschrieben : |
Da ich mich gerade versuche durch das große Netz von Linq to SQL durchzuwurschtel |
Danach sieht es aber nicht aus, denn Linq to SQL kennt kein DBNull ;) . Mit Linq to Objects auf DataSets holst du dir diese Plage aber natürlich wieder zurück.
flyhigh83 - Mo 07.02.11 10:15
Danke,
das ToString() schon vorher zu benutzten hat geholfen.
@Kha: ich werde mir das speziell nochmal suchen. Nur weis ich bisher nicht wie ich sonst wieder auf die Objekte zugreifen kann. Bei den meisten Microsoft Beispielen wird dies auch so gemacht.
Kha - Mo 07.02.11 15:58
flyhigh83 hat folgendes geschrieben : |
Bei den meisten Microsoft Beispielen wird dies auch so gemacht. |
Aber sicher nicht bei welchen zu Linq to SQL. Da geht alles über DataContext, DataSets haben dort nichts verloren.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!