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

标签 c# wcf linq-to-sql dto

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

我尤其感兴趣,例如,如何从两个相关表返回表示层数据。假设下一种情况(大大简化):

数据库有表:

  • 订单 (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 实体,尽管我只需要其中的一个字段。

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

最佳答案

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

关于c# - Linq-to-SQL 和 WCF 服务 - 数据传输对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8602387/

相关文章:

c# - Polly Framework VS Microsoft 瞬时故障处理

c# - 为什么 WCF 流响应在写入磁盘时损坏?

C# 如何将 Expression<Func<SomeType>> 转换为 Expression<Func<OtherType>>

c# - Linq-to-sql 查询中的动态类型

c# - 使用 new 关键字调用基本方法

c# - 对 EntityFramework 和 "normal"SQL 调用使用相同的 SqlConnection

c#: 将 mp3 文件覆盖到另一个文件

wcf - 如何将复杂类型嵌入到 wsdl 定义中?

asp.net - 通过wcf服务通过邮寄方式消费表单数据

c# - 客户关系管理 2011 : Limitation of query expression?