我很好奇使用 Linq-to-SQL 和 WCF 服务开发 n 层应用程序时的最佳实践。
我尤其感兴趣,例如,如何从两个相关表返回表示层数据。假设下一种情况(大大简化):
数据库有表:
订单
(id, OrderName
)OrderDetails
(id, orderid, DetailName
)
中间层有 OrderDetails
的 CRUD 方法。因此,我需要有办法重建实体以附加到上下文以在它从表示层返回时进行更新或插入。
在表示层,我需要显示 OrderDetails
列表以及父表中相应的 OrderName
。
从服务返回的类有两种方法:
使用将封装来自表和投影的数据的 DTO 自定义类:
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(); }
缺点:需要以两种方式分配对表示层都很重要的每个字段(当返回数据时和创建新实体以附加到上下文时,当数据从表示层返回时)
使用自定义的 Linq-to-SQL 实体分部类:
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(); }
缺点:数据库查询将包括 Orders
表中的所有列,Linq-to-SQL 将实现整个 Order 实体,尽管我只需要其中的一个字段。
抱歉这么长的故事。可能是我错过了什么?将不胜感激任何建议。
最佳答案
我会说使用 DTO 和 Automapper,将 DB 实体公开为数据契约(Contract)不是一个好主意
关于c# - Linq-to-SQL 和 WCF 服务 - 数据传输对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8602387/