Мне интересно узнать о лучших практиках при разработке многоуровневого приложения с Linq-to-SQL и службой WCF.
В частности, меня интересует, например, как вернуться к данным уровня представления из двух связанных таблиц. Предположим следующую ситуацию (сильно упрощенную):
База данных содержит таблицы:
Заказы
( id, OrderName
) OrderDetails
( id, orderid, DetailName
) На среднем уровне есть методы CRUD для OrderDetails
. Итак, мне нужен способ перестроить объект для присоединения к контексту для обновления или вставки, когда он вернется из уровня представления.
На уровне представления мне нужно отобразить список OrderDetails
с соответствующим OrderName
из родительской таблицы.
Для классов, возвращаемых службой, есть два подхода:
Использовать собственный класс 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
}).К списку();
}
Минусы: необходимо назначать каждому полю , которое важно для уровня представления обоими способами (при возврате данных и при создании нового объекта для присоединения к контексту, когда данные возвращаются с уровня представления)
Использовать индивидуальный частичный класс сущности 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, хотя мне нужно только одно поле из нее.
Простите за такой длинный рассказ. Может я что-то упустил? Буду признателен за любые предложения.