2011-12-22 29 views
5

我对使用Linq-to-SQL和WCF服务开发n层应用程序时的最佳做法感到好奇。Linq-to-SQL和WCF服务 - 数据传输对象

特别是,我对如何从两个相关表返回到表示层数据感兴趣。假设未来形势(大大简化):

数据库有表:

  • Ordersid, OrderName
  • OrderDetailsid, orderid, DetailName

中间层具有CRUD方法OrderDetails。所以,我需要有方法来重建实体,以便附加到上下文进行更新或在从表示层返回时插入。

在表示层我需要从父表中显示OrderDetails列表和相应的OrderName

有上课两个接近,即从服务返回:

  1. 使用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(); 
    } 
    

    缺点:需要分配字段对于表示层而言都是重要的(在返回数据时和创建用于附加到上下文的新实体时,当数据从表示层返回时)

  2. 使用自定义的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一定会实现整个订单的实体,尽管我只需要一个字段。

对不起,这么长的故事。可能是我错过了什么?将欣赏任何建议。

回答

3

我会说使用DTO和Automapper,不是一个好主意,露出DB实体datacontract

+0

或EmitMapper,他们说它有更好的性能。 – Monsignor 2011-12-23 02:11:08

+0

为什么不EF?非常有趣 – 2014-07-29 03:54:47

1

是的LINQ的使用到SQL的要求,为您或您仍处于设计阶段,你可以选择技术?如果最新,我会建议使用实体框架与自我跟踪实体(STE)。当你从客户端获得实体时,所有客户端更改将由STE自动处理,只需调用Save即可。包括相关实体也很容易:(...some query...).Orders.Include(c => c.OrderDetails)

+0

不幸的是我处于发展阶段。我正在考虑迁移到EF,但由于时间限制,暂时不是一个选择。 – Harm 2011-12-22 12:12:23