【发布时间】:2012-01-26 00:09:42
【问题描述】:
我很好奇使用 Linq-to-SQL 和 WCF 服务开发 n 层应用程序时的最佳实践。
我特别感兴趣,例如,如何从两个相关表返回表示层数据。假设下一种情况(非常简化):
数据库有表:
-
Orders(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(); }缺点:需要以两种方式分配对表示层很重要的 every 字段(返回数据时以及创建新实体以附加到上下文时,当数据从表示层返回时)
-
使用自定义的 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 实体,尽管我只需要其中一个字段。
对不起,这么长的故事。可能是我错过了什么?将不胜感激任何建议。
【问题讨论】:
标签: c# wcf linq-to-sql dto