Entwickler-Ecke
Datenbanken (inkl. ADO.NET) - LINQ Klasse in "normale" Klasse konvertieren
timo12 - Do 09.07.09 15:20
Titel: LINQ Klasse in "normale" Klasse konvertieren
Ich habe ein Klasse in meinem Programm wie folgt:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| public class Einstellung { public int ID { get; set; } public string Name { get; set; } public string Wert { get; set; }
public Einstellung() {
} public Einstellung(string name, string wert) { this.Name = name; this.Wert = wert; }
} |
Des Weiteren habe ich eine LINQ Klasse wie folgt:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| <Table Name="dbo.Einstellungen" Member="Einstellungen"> <Type Name="Einstellungen"> <Column Name="SatzId" Type="System.Int64" DbType="BigInt NOT NULL IDENTITY" IsPrimaryKey="true" IsDbGenerated="true" CanBeNull="false" /> <Column Name="Benutzerid" Type="System.Int32" DbType="Int NOT NULL" CanBeNull="false" /> <Column Name="Name" Type="System.String" DbType="VarChar(50) NOT NULL" CanBeNull="false" /> <Column Name="Wert" Type="System.String" DbType="VarChar(MAX) NOT NULL" CanBeNull="false" /> <Association Name="Benutzer_Einstellungen" Member="Benutzer" ThisKey="Benutzerid" OtherKey="BenutzerId" Type="Benutzer" IsForeignKey="true" /> </Type> </Table> |
(oder als Bild im Anhang)
Die LINQ-Klasse EInstellungen hängt an einer weiteren LINQ-Klasse Benutzer. Der Benutzer hat mehrere Einstellungen, also habe ich doch eine Art List<Einstelklungen> am Benutzer, oder?
Dann habe ich den Benutzer ausgelesen wie folgt:
C#-Quelltext
1: 2: 3: 4:
| lBenutzerDataContext _dc = new lBenutzerDataContext(); var _us = (from t in _dc.Benutzer where t.BenutzerId == benutzerid select t).FirstOrDefault (); |
Jetzt versuche ich in die EInstellungen der LINQ Abfrage in meine List<Einstellung> zu bekommen.
Habe folgendes versucht:
C#-Quelltext
1: 2:
| List<Einstellung> _e = new List<Einstellung>(); _e = _us.Einstellungen; |
Geht nicht genuasowenig wie die hier:
C#-Quelltext
1: 2:
| List<Einstellung> _e = new List<Einstellung>(); _e = _us.Einstellungen.ToList(); |
C#-Quelltext
1: 2:
| List<Einstellung> _e = new List<Einstellung>(); _e = (List<Einstellung>)_us.Einstellungen; |
Bei dem hier:
C#-Quelltext
1: 2:
| List<Einstellung> _e = new List<Einstellung>(); _e = (List<Einstellung>)_us.Einstellungen.Cast<Einstellung>(); |
Bekomme ich zumidest vom VS keine Fehlermeldung, aber mein komplettes Programm stürzt mir ab!
Ich hoffe mir jemand helfen.
Timo
Moderiert von
Kha: Formatierung angepasst.
gfoidl - Do 09.07.09 18:44
Hallo,
mit FirstOrDefault() wird eine Instanz zurückgegeben falls vorhanden und sonst null.
Somit kann dieses Ergebnis nicht in eine Liste gewandelt werden (außer in eine Liste mit genau einem Element).
Wenn du eine Liste aus der LINQ-Query willst dann verwendet .ToList().
zB
C#-Quelltext
1: 2: 3: 4: 5:
| var _us = (from t in _dc.Benutzer where t.BenutzerID == benutzerid select t ).ToList(); |
mfG Günther
Kha - Do 09.07.09 18:50
@timo12:
Ich verstehe nicht ganz - die LINQ-Klassen sind doch schon so leichtgewichtig, wozu brauchst du dann noch deine eigene "Einstellung"-Klasse? Es spricht doch nichts dagegen, überall mit der LINQ-Klasse zu arbeiten.
@gfoidl: Es geht um die Einstellungen, nicht um den Benutzer.
timo12 - Do 09.07.09 18:51
Ich habe das FirstOrDefault auf den Benutzer angewendet (ich will ja nur einen Benutzer lesen), dieser beinhaltet aber ein List<Einstellungen>, eine LINQ List<>. Und genau diese versuche ich zu konvertieren.
gfoidl - Do 09.07.09 18:57
Ach so...mit hat das Bild dann irritiert.
Das geht dann mit der SelectMany-Erweiterungsmethode bzw mit der Query-Syntax:
C#-Quelltext
1: 2: 3: 4: 5:
| var _us = from t in _dc.Benutzer where t.BenutzerID == benutzerid from e in t.Einstellung select e; |
Hoffe es ist jetzt das Richtige :D
mfG Gü
Kha - Do 09.07.09 19:02
An die Liste ist er schon im ersten Beitrag rangekommen:
_us.Einstellungen ;) . Es geht um das
Konvertieren in eine Liste seiner eigenen Klasse.
Das funktioniert grundsätzlich nur manuell:
C#-Quelltext
1: 2:
| foreach (var einstellung in _us.Einstellungen) _e.Add(new Einstellung { ID = einstellung.ID; ... }); |
(Bezeichnendere Namen wären übrigens schön, welche ohne Unterstriche noch besser ;) )
Aber wie gesagt macht das imho keinen Sinn.
gfoidl - Do 09.07.09 19:05
Die foreach ist überflüssig. Beim obigen Code braucht nur beim select new Einstellung hinzugefügt werden und dann noch ToList und die Liste liegt vor.
Sinn macht es nur wenn die Abfrage nicht verzögert ausgeführt werden soll sondern sofort. Ob das die Absicht ist weiß ich nicht.
mfG Günther
Kha - Fr 10.07.09 01:14
Ja, könnte man auch in die Query packen. Aber noch einmal: timo12 will das Ergebnis der Query auf seine eigene Klasse abbilden, die 1:1 der LINQ-Klasse entspricht. Und das macht doch einfach keinen Sinn, oder :nixweiss: ?
Wenn es tatsächlich um Deferred Loading geht, tut es, wie du sagtest, ToList. Und wenn "Einstellung" irgendwann weitere Entities beinhaltet, bietet sich eher DataLoadOptions an, als einfach die Klasse 1:1 zu kopieren.
timo12 - Fr 10.07.09 07:23
OK danke ihr habt mir geholfen. Es sind meine ersten Schritte mit LINQ to SQL und ich probiere noch.
Ich verwende jetzt direkt die LINQ KLasse und habe die andere verworfen, macht wirklich keinen Sinn :-)
Timo
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!