2009-05-28 9 views
0

J'essaie de trouver une manière claire de remplir mes classes de modèles d'objets générés LINQ à SQL. Mon objectif est de garder mes modèles et LinqModels séparés. Disons que j'ai les modèles suivants:Remplissage de modèles à l'aide de LINQ

public class Person { 
    public List<Account> Accounts {get; set;} 
} 
public class Account { 
    public List<Purchase> Purchases {get; set;} 
} 
public Purchase { 
    public String Whatever {get; set;} 
} 

Maintenant, j'ai aussi des modèles de données presque identiques générés par LINQ to SQL. Donc, si je veux remplir un objet personne que je vais ajouter un getter dans la classe partielle DataContext:

public Person GetPersonByID(int personID) { 
    .... 
} 

Comment nous remplissons cet objet Personne et ses propriétés enfants tout au long du reste de l'application se fait comme this:

public Person GetPersonByID(int personID) { 
    Person res = 
     from p in Persons 
     select new Person() { 
      Accounts = (
       from a in p.Accounts 
       select new Account() { 
        Purchases = (
         from m in p.Purchases 
         select new Purchase() { 
          Whatever = m.Whatever 
         } 
        ).ToList() 
       } 
      ).ToList() 
     } 
    return res; 
} 

Donc, pour chaque propriété enfant, nous devons étendre la requête. Ce que je préférerais vraiment est de savoir si je pouvais faire quelque chose comme ceci:

public Person GetPersonByID(int personID) { 
    return new Person(this.Persons.SingleOrDefault(p => p.ID == personID)); 
} 
.... 
public class Person { 
    public Person(DataModels.Person p) { 
     Accounts = (from a in p.Accounts select new Account(a)).ToList(); 
    } 
} 
public class Account { 
    public Account(DataModels.Account a) { 
     Purchases = (from r in a.Purchases select new Purchase(r)).ToList(); 
    } 
} 
public class Purchase { 
    public Purchase(DataModels.Purchase r) { 
     Whatever = r.Whatever 
    } 
} 

Cela est beaucoup plus facile à gérer, mais l'appel GetPersonByID initial ne retourne pas les données que je dois remplir ces objets enfants. Y at-il un moyen de contourner cela?

Ou existe-t-il une meilleure alternative à remplir des objets de modèle en utilisant LINQ to SQL?

*** Désolé si mes exemples de code ne sont pas tout à fait raison *

Répondre

0

Ce que vous cherchez est appelé « l'ignorance de persistance ».

C'est une propriété appréciée d'un design, spécifiquement dans les cercles DDD (Domain Driven Design). Vous pouvez y parvenir par exemple en utilisant les fonctionnalités de mapping XML de LinqToSQL, où vous ne générez pas de classes de données et indiquez à LTS comment mapper directement vos classes de domaine (Account, Purchase etc) à la base de données. En raison des capacités limitées de LinqToSQL en termes d'options de mappage (en particulier l'absence d'objets de valeur, la limitation du mappage d'héritage et le manque de prise en charge des relations Plusieurs vers plusieurs), cela pourrait fonctionner . Une autre option, si vous avez vos classes générées par LTS et vos classes de domaine comme ci-dessus, est de regarder dans Automapper, ce qui peut vous aider à supprimer certaines tâches répétitives.

Questions connexes