Tôi tò mò về thực tiễn tốt nhất khi phát triển ứng dụng n-tier với dịch vụ LINQ-to-SQL và WCF.Dịch vụ LINQ-to-SQL và WCF - đối tượng chuyển dữ liệu
Cụ thể, tôi quan tâm, ví dụ: cách quay lại dữ liệu cấp bản trình bày từ hai bảng có liên quan. Giả sử tình huống tiếp theo (nhiều đơn giản):
Cơ sở dữ liệu có bảng:
Orders
(id, OrderName
)OrderDetails
(id, orderid, DetailName
)
tầng Trung có phương pháp CRUD cho OrderDetails
. Vì vậy, tôi cần phải có cách để xây dựng lại thực thể để gắn vào bối cảnh để cập nhật hoặc chèn khi nó trở lại từ lớp trình bày.
Trong lớp trình bày, tôi cần hiển thị danh sách OrderDetails
tương ứng OrderName
từ bảng chính.
Có hai cách tiếp cận cho các lớp học, mà trở về từ các dịch vụ:
Sử dụng DTO lớp tùy chỉnh mà sẽ đóng gói dữ liệu từ hai bảng và chiếu:
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(); }
Nhược điểm: cần phải gán mọi trường quan trọng đối với lớp trình bày theo cả hai cách (khi trả lại dữ liệu và khi tạo đối tượng mới để gắn vào ngữ cảnh, khi dữ liệu trở lại từ lớp trình bày)
Sử dụng tùy chỉnh LINQ-to-SQL thực thể một phần lớp:
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(); }
Nhược điểm: truy vấn cơ sở dữ liệu sẽ bao gồm tất cả các cột từ Orders
bảng, LINQ-to-SQL sẽ thực hóa toàn bộ thực thể Order, mặc dù tôi chỉ cần một trường từ nó.
Xin lỗi vì câu chuyện dài như vậy. Tôi có thể bỏ lỡ điều gì đó không? Sẽ đánh giá cao bất kỳ đề xuất nào.
Hoặc EmitMapper, họ nói rằng nó có hiệu suất tốt hơn nhiều. – Monsignor
Tại sao không phải EF? Rất thú vị –