Autor Beitrag
timo12
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 28



BeitragVerfasst: Do 09.07.09 15:20 
Ich habe ein Klasse in meinem Programm wie folgt:

ausblenden 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:

ausblenden 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:

ausblenden 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:

ausblenden C#-Quelltext
1:
2:
List<Einstellung> _e = new List<Einstellung>();
_e = _us.Einstellungen;


Geht nicht genuasowenig wie die hier:

ausblenden C#-Quelltext
1:
2:
List<Einstellung> _e = new List<Einstellung>();
_e = _us.Einstellungen.ToList();


ausblenden C#-Quelltext
1:
2:
List<Einstellung> _e = new List<Einstellung>();
_e = (List<Einstellung>)_us.Einstellungen;


Bei dem hier:
ausblenden 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 user profile iconKha: Formatierung angepasst.
Einloggen, um Attachments anzusehen!
gfoidl
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 157
Erhaltene Danke: 19

Win XP
C#, Fortran 95 - Visual Studio
BeitragVerfasst: 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
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
var _us =
   (from t in _dc.Benutzer
    where t.BenutzerID == benutzerid
    select t
   ).ToList();



mfG Günther

_________________
Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 28



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 157
Erhaltene Danke: 19

Win XP
C#, Fortran 95 - Visual Studio
BeitragVerfasst: 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:
ausblenden 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ü

_________________
Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 157
Erhaltene Danke: 19

Win XP
C#, Fortran 95 - Visual Studio
BeitragVerfasst: 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

_________________
Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 28



BeitragVerfasst: 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