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

本文关键字:数据传输 对象 服务 WCF Linq-to-SQL | 更新日期: 2023-09-27 18:18:40

我对使用Linq-to-SQL和WCF服务开发n层应用程序的最佳实践很好奇。

例如,我特别感兴趣的是如何从两个相关的表返回到表示层数据。假设下一种情况(非常简化):

数据库中有表:

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

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

在表示层,我需要显示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-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实体,尽管我只需要其中的一个字段。

很抱歉,说了这么长。也许我错过了什么?

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

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

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