2009-05-28 3 views
0

Я пытаюсь выяснить ясный способ заполнения классов модели из созданных объектов LINQ to SQL. Моя цель - сохранить отдельные модели и LinqModels. Скажем, у меня есть следующие модели:Популяционные модели с использованием 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;} 
} 

Теперь у меня также есть идентичные модели данных, сгенерированные LINQ to SQL. Так что, если я хочу, чтобы заполнить объект Person я собираюсь добавить метод геттер в разделяемом классе DataContext:

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

Как заполнить этот Person объект и его потомков свойства на протяжении остальной части приложения делается как это:

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

Итак, для каждого дочернего имущества нам нужно расширить запрос. То, что я действительно предпочел бы, если я мог бы сделать что-то больше, как это:

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 
    } 
} 

Это гораздо более управляемым, но первоначальный вызов GetPersonByID не возвращает данные мне нужно, чтобы заполнить эти дочерние объекты. Есть ли способ обойти это?

Или есть лучшая альтернатива населению объектов модели с использованием LINQ to SQL?

*** Извините, если мои примеры кода, не совсем верно *

ответ

0

То, что вы ищете, называется «живучесть невежество».

Это ценное свойство дизайна, особенно в кругах DDD (Domain Driven Design).

Вы можете достичь этого, например, используя возможности XML-сопоставления LinqToSQL, в которых вы не генерируете классы данных и не указываете LTS, как напрямую сопоставлять классы домена (учетная запись, покупка и т. Д.) В базе данных.

Из-за ограниченных возможностей LinqToSQL с точки зрения параметров сопоставления (в частности, отсутствия объектов ценности, ограничения на сопоставление наследования и отсутствия поддержки отношений «многие-ко-многим»), это может быть или не работать в вашем случае ,

Другой вариант, если у вас есть классы, сгенерированные LTS, и классы вашего домена, как указано выше, - это посмотреть на Automapper, что может помочь получить некоторые из повторяющихся действий.

Смежные вопросы