2010-11-23 53 views
1

J'ai des classes DataContext générées à partir de dbml. Une fois que je reçois des données de la base de données, je dois les transformer en classes DataContract afin que les objets puissent être envoyés via WCF.Transformation de Linq en objets Sql DataContext en objets DataContract

Une façon de le faire est comme ceci:

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();; 
     } 

Y at-il une meilleure façon de le faire via un fichier XSD/XSLT que je peux définir dans mon projet et pointez simplement?

Répondre

1

Nous avons écrit Translator<FromDataModelType, ToDataContractType> classes pour cela, et nous utilisons AutoMapper comme une manière rapide et indolore d'accomplir le mappage entre les propriétés. Cela suppose que vous devez appliquer des transformations aux classes DataContext, comme vous le faites en affectant une sous-chaîne Name à FirstName.

+0

Oui, j'ai besoin de transformer Nom en Prénom par une sous-chaîne (à titre d'exemple). Je vois que l'AutoMapper va sûrement aider. Mais je me demandais si je pouvais utiliser un fichier XML qui définit les mappages et simplement l'appeler. Est-ce possible ? – DeeStackOverflow

+0

@DeeStackOverflow pas dans Automapper, ce n'est pas le cas. De la principale dev: ["Non XML est le diable."] (Http://automapper.codeplex.com/wikipage?title=Roadmap) :) Un autre utilisateur dans ce fil suggère [otis-lib] (http://otis-lib.googlecode.com/svn/) comme alternative, mais je ne l'ai jamais essayé. –

+0

Hmm ... vous semblez indiquer que l'utilisation de xml n'est pas bien conseillée par la communauté. Merci pour le conseil. – DeeStackOverflow

2

Ouvrez le fichier dbml, sélectionnez le concepteur et, dans la fenêtre des propriétés, définissez le Mode de sérialisation sur Unidirectionnel, c'est tout ce dont vous avez besoin pour envoyer les enregistrements Employé renvoyés du datacontext via WCF.

J'espère que ce que vous cherchez.

+0

Non. La classe datacontract peut être différente de la classe datacontext - les propriétés peuvent être transformées, aplaties etc. Je voulais faire cette transformaton via un fichier xml plutôt que du code - je suppose que c'est plus propre que d'écrire le mien ou d'en utiliser code de fête. – DeeStackOverflow

0

Dans le concepteur dbml, définissez le mode de sérialisation sur unidirectionnel. Travail terminé.

Si vous avez besoin d'une couche DTO légèrement différente, peut-être que AutoMapper est une bonne option.

+0

Je dois appliquer certaines transformations de propriétés. Il doit s'agir d'une nouvelle classe DataContract qui aplatirait probablement les données. – DeeStackOverflow