verwendetes Datenbanksystem: <SQL Server 2008>
Der DataReader läuft doch per "Forward Cursor" die Liste durch.
In der while Schleife kann ich bequem auf die Daten des aktuellen Eintrags zugreifen.
Nun habe ich eigene Entities (als Klassen) im DAL, und finde keine Lösung, diese einzeln zu laden, ohne den gesamten Datenbestand (ala DataTable) im Voraus zu speichern.
Der übliche Weg über den DataReader
while(dr.Read())
{
att1 = dr["Att1"];
att2 = dr["Att2"];
att3 = dr["Att2"];
}
Hier das Problem mit dem Entity
while(dr.Read())
{
Entity.att1 = dr["Att1"];
Entity.att2 = dr["Att2"];
Entity.att3 = dr["Att2"];
}
Natürlich wird das Entity mit den Daten initialisiert, aber kann in der Schleife nicht das Entity zurückgeben. Nur um im BLayer damit arbeiten zu können, brauche ich den gesamten Datenbestand (zumindest 1x Zugriff). Wenn ich jedes Entity in eine List adde und diese List zurückgebe, habe ich das gleiche Problem wie mit dem DataTable. Eine Idee war, das initialisierte Entity über einen Eventhandler zurückzugeben. Der BLayer bekommt so die einzelnen Entities ohne grobe Speicherauslastung. Finde das unsauber.
Kennt jemand von euch einen besseren Ansatz? Danke.
Du könntest einen ORMapper nutzen um die Datenbanktabellen auf Entities zu mappen. Dann würde der Mapper das Initialisieren der Daten für dich übernehmen. Wäre das nichts für dich dann bleibt dir wohl nichts anderes übrig als die Entities einzeln zu initialisieren und in irgendeiner Art und Weise zwischenzuspeichern.
Wenn du ein einzelnes Entity brauchst dann musst du dir entsprechend die Funktion bauen. Ich stelle mit das so vor:
public IEnumerable<BeispielObjekt> GetAllBeispielObjekte()
{
//DataReader usw initialiseren...
while(dr.Read())
{
yield return new BeispielObjekt(dr["Attr1"],dr["Attr2"]);
}
}
//und
public BeispielObjekt GetBeispielObjektById(Guid id)
{
//DataReader usw initialisieren... mit filter auf id...
return new BeispielObjekt(dr["Attr1"],dr["Attr2"]);
}
Hoffe ich konnte dir eine einigermassen gute Idee geben.
Lg