Linq-to-SQL和WCF服务 - 数据传输对象

Har*_*arm 5 c# wcf dto linq-to-sql

在使用Linq-to-SQL和WCF服务开发n层应用程序时,我对最佳实践感到好奇.

特别是,我很感兴趣,例如,如何从两个相关表返回表示层数据.假设下一个情况(大大简化):

数据库有表:

  • Orders(id, OrderName)
  • OrderDetails(id, orderid, DetailName)

中间层有CRUD方法OrderDetails.所以,我需要有办法重建实体以附加到更新的上下文或从表示层返回时插入.

在表示层我需要显示OrderDetailsOrderName父表对应的列表.

从服务返回的类有两种方法:

  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();
    }
    
    Run Code Online (Sandbox Code Playgroud)

    缺点:需要以两种方式分配对表示层很重要的每个字段(当返回数据时和创建新实体以附加到上下文时,当数据从表示层返回时)

  2. 使用自定义的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();
    }
    
    Run Code Online (Sandbox Code Playgroud)

缺点:数据库查询将包括Orders表中的所有列,Linq-to-SQL将实现整个Order实体,尽管我只需要一个字段.

对不起这么长的故事.可能是我错过了什么?将不胜感激任何建议.

Bri*_*hra 3

我想说使用 DTO 和 Automapper,将数据库实体公开为数据契约不是一个好主意