2011-01-11 8 views
2

Guten Tag!Wie Sie von nicht typisierten DataSets nach POCO LINQ2SQL in der Legacy-Anwendung wechseln können

Ich habe eine Legacy-Anwendung, in der Datenzugriffsschicht von Klassen besteht, wo Abfragen werden durchgeführt unter Verwendung SqlConnection/SqlCommand und die Ergebnisse werden zu den oberen Schichten in untypisierten Datasets/Datatable eingewickelt übergeben.

Jetzt arbeite ich an der Integration dieser Anwendung in neuere wo geschrieben in ASP.NET MVC 2, wo LINQ2SQL für den Datenzugriff verwendet wird. Ich möchte die komplexe Logik des Generierens komplexer Abfragen, die in LINQ2SQL an SqlConnection/SqlCommand übergeben werden, nicht neu schreiben (und keine Berechtigung dafür haben), aber ich möchte Ergebnisse dieser Abfragen als stark typisierte Objekte haben Sammlung anstelle von untypisierten DataSets/DataTable.

Die Grundidee besteht darin, alten Datenzugriffscode in einem nett aussehenden ASP.NET MVC "Model" zu verpacken.

Was ist der schnelle \ einfache Weg, dies zu tun?

Zusätzlich zur Antwort unten hier ist eine schöne Lösung, basierend auf AutoMapper: http://elegantcode.com/2009/10/16/mapping-from-idatareaderidatarecord-with-automapper/

+0

L2SQL * ist * ziemlich schnell/einfach. Ziehe einfach die Tabellen dorthin und fange an, Code dagegen zu schreiben. – RPM1984

+0

LINQ2SQL ist einfach, aber neu geschriebene Hand-optimierte Logik in SQL ist es nicht, "und habe keine Erlaubnis, dies zu tun", wie oben erwähnt. – artvolk

Antwort

3

Ein Ansatz, die Sie ergreifen könnte das Datareader und die Übertragung verwendet wird. Für jedes Objekt, mit dem Sie arbeiten möchten, definieren Sie die Klasse in einem Datenübertragungsobjekt-Ordner (oder wie auch immer Ihr Projekt strukturiert ist), dann haben Sie in Ihrer Datenzugriffsschicht etwas in der folgenden Richtung.

Wir verwendeten etwas sehr ähnliches in einem Projekt mit einer stark normalisierten Datenbank, aber im Code brauchten wir diese Normalisierung nicht, also verwendeten wir Prozeduren, um die Daten in mehr verwendbare Objekte zu bringen. Wenn Sie diese Objekte ebenfalls speichern müssen, müssen Sie die Objekte in Datenbankbefehle übersetzen.

Was ist die schnelle \ einfache Art zu tun dies?

Abhängig von der Anzahl der Klassen usw. dies ist nicht der schnellste Ansatz sein könnte, aber es erlaubt Ihnen, die Objekte zu verwenden, sehr ähnlich wie die Linq-Objekte und in Abhängigkeit von der Art der Sammlung verwendet (IList, IEnumerable etc) Sie können die Erweiterungsmethoden für diese Arten von Sammlungen verwenden.

public IList<NewClass> LoadNewClasses(string abc) 
{ 
    List<NewClass> newClasses = new List<NewClass>(); 

    using (DbCommand command = /* Get the command */) 
    { 
     // Add parameters 
     command.Parameters["@Abc"].Value = abc; 

     // Could also put the DataReader in a using block 
     IDataReader reader = /* Get Data Reader*/; 

     while (reader.Read()) 
     { 
      NewClass newClass = new NewClass(); 
      newClass.Id = (byte)reader["Id"]; 
      newClass.Name = (string)reader["Name"]; 

      newClasses.Add(newClass); 
     } 

     reader.Close(); 
    } 

    return newClasses; 
} 
Verwandte Themen