Служба Linq-to-SQL и WCF - объекты передачи данных

Мне интересно узнать о лучших практиках при разработке многоуровневого приложения с Linq-to-SQL и службой WCF.

В частности, меня интересует, например, как вернуться к данным уровня представления из двух связанных таблиц. Предположим следующую ситуацию (сильно упрощенную):

База данных содержит таблицы:

  • Заказы ( id, OrderName )
  • OrderDetails ( id, orderid, DetailName )

На среднем уровне есть методы CRUD для OrderDetails . Итак, мне нужен способ перестроить объект для присоединения к контексту для обновления или вставки, когда он вернется из уровня представления.

На уровне представления мне нужно отобразить список OrderDetails с соответствующим OrderName из родительской таблицы.

Для классов, возвращаемых службой, есть два подхода:

  1. Использовать собственный класс DTO, который будет инкапсулировать данные как из таблиц, так и из проекции:

     class OrderDetailDTO
    {
    public int Id {получить; установленный; }
    общедоступная строка DetailName {получить; установленный; }
    общедоступная строка OrderName {получить; установленный; }
    }
    IEnumerable  GetOrderDetails ()
    {
    var db = new LinqDataContext ();
    return (из od в db.OrderDetails
    выберите новый OrderDetailDTO
     {
    Id = od.id,
    DetailName = od.DetailName,
    OrderName = od.Order.OrderName
     }).К списку();
    }
    

    Минусы: необходимо назначать каждому полю , которое важно для уровня представления обоими способами (при возврате данных и при создании нового объекта для присоединения к контексту, когда данные возвращаются с уровня представления)

  2. Использовать индивидуальный частичный класс сущности Linq-to-SQL:

     частичный класс OrderDetail
    {
     [DataMember]
    публичная строка OrderName
     {
    получать
     {
    return this.Order.OrderName // возвращаем значение из связанной сущности
     }
    установленный {}
     }
    }
    IEnumerable  GetOrderDetails ()
    {
    var db = new LinqDataContext ();
    var loadOptions = new DataLoadOptions ();
    loadOptions.LoadWith  (item => item.Order);
    db.LoadOptions = параметры;
    return (из od в db.OrderDetails
    выберите od) .ToList ();
    }
    

Минусы: запрос к базе данных будет включать все столбцы из таблицы Orders , Linq-to-SQL материализует всю сущность Order, хотя мне нужно только одно поле из нее.

Простите за такой длинный рассказ. Может я что-то упустил? Буду признателен за любые предложения.

5
задан Harm 22 December 2011 в 13:05
поделиться