Ciekawi mnie dobra praktyka przy tworzeniu aplikacji n-warstwowych z usługą Linq-SQL i WCF.Usługa Linq-to-SQL i WCF - obiekty przesyłania danych
W szczególności, jestem zainteresowany, na przykład, jak powrócić do danych poziomu prezentacji z dwóch powiązanych tabel. Załóżmy, że następny sytuacji (znacznie uproszczony):
Database tabele:
Orders
(id, OrderName
)OrderDetails
(id, orderid, DetailName
)
warstwa środkowa posiada metody CRUD dla OrderDetails
. Potrzebuję więc sposobu na odbudowanie encji w celu dołączenia do kontekstu aktualizacji lub wstawienia po powrocie z warstwy prezentacji.
W warstwie prezentacji potrzebuję wyświetlić listę OrderDetails
z odpowiadającą OrderName
z tabeli nadrzędnej.
Istnieją dwa podejścia do zajęć, który powrócił ze służby:
Zastosowanie DTO niestandardowej klasy, które będą symbolizować dane z obu tabel i projekcji:
class OrderDetailDTO { public int Id { get; set; } public string DetailName { get; set; } public string OrderName { get; set; } } IEnumerable<OrderDetailDTO> GetOrderDetails() { var db = new LinqDataContext(); return (from od in db.OrderDetails select new OrderDetailDTO { Id = od.id, DetailName = od.DetailName, OrderName = od.Order.OrderName }).ToList(); }
Wady: konieczność przypisania każde pole, które jest ważne dla warstwy prezentacji w obie strony (podczas zwracania danych i podczas tworzenia nowego obiektu do dołączania do kontekstu, gdy dane wracają z warstwy prezentacji)
Użyj własnego LINQ-SQL podmiot częściowe klasa:
partial class OrderDetail { [DataMember] public string OrderName { get { return this.Order.OrderName // return value from related entity } set {} } } IEnumerable<OrderDetail> GetOrderDetails() { var db = new LinqDataContext(); var loadOptions = new DataLoadOptions(); loadOptions.LoadWith<OrderDetail>(item => item.Order); db.LoadOptions = options; return (from od in db.OrderDetails select od).ToList(); }
Wady: zapytanie do bazy danych będzie zawierać wszystkie kolumny z Orders
stołowy, LINQ-to-SQL zmaterializuje całą jednostkę porządku, chociaż potrzebujesz tylko jednego pola.
Przepraszam za tak długą historię. Czy mogę coś przeoczyć? Doceni wszelkie sugestie.
Albo EmitMapper, mówią, że ma znacznie lepszą wydajność. – Monsignor
Dlaczego nie EF? Bardzo interesujące –