我对使用Linq-to-SQL和WCF服务开发n层应用程序时的最佳做法感到好奇。Linq-to-SQL和WCF服务 - 数据传输对象
特别是,我对如何从两个相关表返回到表示层数据感兴趣。假设未来形势(大大简化):
数据库有表:
Orders
(id, OrderName
)OrderDetails
(id, orderid, DetailName
)
中间层具有CRUD方法OrderDetails
。所以,我需要有方法来重建实体,以便附加到上下文进行更新或在从表示层返回时插入。
在表示层我需要从父表中显示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到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到SQL一定会实现整个订单的实体,尽管我只需要一个字段。
对不起,这么长的故事。可能是我错过了什么?将欣赏任何建议。
或EmitMapper,他们说它有更好的性能。 – Monsignor 2011-12-23 02:11:08
为什么不EF?非常有趣 – 2014-07-29 03:54:47