Заполнение моделей с использованием LINQ - PullRequest
0 голосов
/ 28 мая 2009

Я пытаюсь найти ясный способ перенести мои классы моделей из LINQ в объекты, сгенерированные SQL. Моя цель - разделить мои Модели и LinqModels. Скажем, у меня есть следующие модели:

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, я собираюсь добавить метод get в частичный класс 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?

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

1 Ответ

0 голосов
/ 28 мая 2009

То, что вы ищете, называется "невежеством постоянства".

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...