2010-11-23 7 views
1

Ich habe DataContext-Klassen aus dbml generiert. Sobald ich Daten aus der Datenbank bekomme, muss ich sie in DataContract-Klassen transformieren, damit die Objekte über WCF gesendet werden können.Umwandlung von Linq in SQL DataContext-Objekte in DataContract-Objekte

Eine Möglichkeit, dies zu tun ist, wie folgt aus:

using (var dc = new TestDBL2SDataContext(Settings.Default.TestDBConnectionString)) 
     { 
      var myEmp = from rec in dc.Employees 
        select new MyDataContracts.Employee 
          { 
           FirstName = rec.Name.Substring(0,10) 
          }; 
      return myEmp.FirstOrDefault();; 
     } 

Gibt es einen besseren Weg, dies über eine XSD/XSLT-Datei zu tun, die ich in meinem Projekt definieren und nur darauf zu?

Antwort

1

Wir haben hierfür Klassen Translator<FromDataModelType, ToDataContractType> geschrieben und verwenden AutoMapper als eine schnelle und schmerzlose Möglichkeit, die Zuordnung zwischen Eigenschaften zu erreichen.

Dies setzt voraus, dass Sie Transformationen auf die DataContext-Klassen anwenden müssen, indem Sie eine Teilzeichenfolge von Name zu FirstName zuweisen.

+0

Ja, ich muss Name in Vorname über eine Teilzeichenfolge (als ein Beispiel) umwandeln. Ich sehe, dass der AutoMapper sicherlich helfen wird. Aber ich fragte mich, ob ich eine XML-Datei verwenden könnte, die die Zuordnungen definiert und sie einfach aufruft. Ist das möglich ? – DeeStackOverflow

+0

@DeeStackOverflow nicht in Automapper, ist es nicht. Von der Lead-Dev: ["Nein. XML ist der Teufel."] (Http://automapper.codeplex.com/wikipage?title=Roadmap) :) Ein anderer Benutzer in diesem Thread schlägt vor [otis-lib] (http:// otis-lib.googlecode.com/svn/) als Alternative, aber ich habe es nie ausprobiert. –

+0

Hmm ... Sie scheinen darauf hinzuweisen, dass die Verwendung von XML von der Community nicht gut beraten wird. Danke für den Tipp. – DeeStackOverflow

2

Öffnen Sie die dbml-Datei, wählen Sie den Designer aus, und stellen Sie im Eigenschaftenfenster den Serialisierungsmodus auf Unidirektional ein. Dies ist alles, was Sie zum Senden der aus dem Datenkontext zurückgegebenen Employee-Datensätze über WCF benötigen.

Ich hoffe, dass was Sie suchen.

+0

Nein. Die Datenkontraktklasse kann sich von der Datenkontextklasse unterscheiden - Eigenschaften können transformiert, abgeflacht usw. werden. Ich wollte diese Transformation über eine XML-Datei durchführen, anstatt Code zu sein - ich gehe davon aus, dass sie sauberer ist, anstatt meine eigene zu schreiben oder eine dritte zu verwenden Party-Code. – DeeStackOverflow

0

Setzen Sie im dbml-Designer den Serialisierungsmodus auf unidirektional. Job erledigt.

Wenn Sie eine etwas andere DTO-Schicht benötigen, ist AutoMapper möglicherweise eine gute Option.

+0

Ich muss einige Transformationen von Eigenschaften anwenden. Es muss sich um eine neue DataContract-Klasse handeln, die Daten wahrscheinlich verflacht. – DeeStackOverflow