C# Linq嵌套关系和DTO

C# Linq嵌套关系和DTO,c#,entity-framework,linq-to-entities,C#,Entity Framework,Linq To Entities,我正在从Oracle数据库获取数据,并创建一个供内部使用的API。有些课程是(为简洁起见缩短): 客户订单选项卡 Public partial class CustomerOrderTab Public string OrderNo { get; set; } [ForeignKey("CustomerMV")] public string CustomerNo { get; set; } public List<CustomerOrderLineT

我正在从Oracle数据库获取数据,并创建一个供内部使用的API。有些课程是(为简洁起见缩短):

客户订单选项卡

    Public partial class CustomerOrderTab
    Public string OrderNo { get; set; }
    [ForeignKey("CustomerMV")]
    public string CustomerNo { get; set; }
    public List<CustomerOrderLineTab> CustomerOrderLines { get; set; }
    public List<CustomerOrderChargeTab> CustomerOrderCharge { get; set; }
    public List<ShipmentOrderLineTab> ShipmentOrderLines { get; set; }
    public CustomerMV CustomerMV { get; set; }
Shipmentor Derlinedto

    public class ShipmentOrderLinesDTO
    public decimal ShipmentId { get; set; }
    public string OrderNo { get; set; }
    public ShipmentTab MyShipment { get; set; }
public class ShipmentOrderLinesDTO
public decimal ShipmentId { get; set; }
public string OrderNo { get; set; }
public ShipmentDTO MyShipment { get; set; }
发货标签

    public partial class ShipmentTab
    [ForeignKey("ShipmentOrderLineTab")]
    public decimal ShipmentId { get; set; }
    public string ShipperAddress1 { get; set; }
    public string ShipperAddress2 { get; set; }
    public List<ShipmentHandlingUnitTab> ShipmentHandlingUnits { get; set; }
装运是ShipmentDerLine的子项(每行只有一次装运)

ShipmentOrder是CustomerOrder的子项(每个订单可以有许多行)

我认为问题在于每条生产线只有一批货,但我已经尝试了很多方法,无法将其映射到我的DTO。

修复您的型号:

Shipmentor Derlinedto

    public class ShipmentOrderLinesDTO
    public decimal ShipmentId { get; set; }
    public string OrderNo { get; set; }
    public ShipmentTab MyShipment { get; set; }
public class ShipmentOrderLinesDTO
public decimal ShipmentId { get; set; }
public string OrderNo { get; set; }
public ShipmentDTO MyShipment { get; set; }
“选择”仅用于投影集合。对于非集合,您只需创建一个新对象

var orderLines = _context.CustomerOrderTab
  .Where(o => o.OrderNo == orderno)
  .Select(o => new OrderDTO {
    OrderNo = o.OrderNo,
    CustomerName = o.CustomerMV.CustomerName,
    ShipmentOrderLines = o.ShipmentOrderLines
      .Select(ob => new ShipmentOrderLinesDTO {
        ShipmentId = ob.ShipmentId,
        OrderNo = ob.OrderNo,
        MyShipment = new ShipmentDTO {
          ShipmentId = ob.Shipment.ShipmentId,
          ...
          ShipmentHandlingUnits = ob.Shipment.ShipmentHandlingUnits
            .Select(shu=> new ShipmentHandlingUnitDTO {
              ...
            }).ToList()
        }
      }
    }).ToList()
说到这里,我通常在我的数据模型类上有映射扩展方法,它允许这样的事情:

var orderLines = _context.CustomerOrderTab
  .Where(o=>o.OrderNo == orderno)
  .Select(o=> o.ToDto());
示例类:

public static class CustomerOrderTabExtensions {
  public static CustomerOrderDto ToDto(this CustomerOrderTab cot) {
    return new CustomerOrderDto {
      OrderNo = cot.OrderNo,
      ...
      OrderLines = cot.CustomerOrderLines
        .Select(col=>col.ToDto())
        .ToList()
    }
  }
}
或使用

var orderLines = _context.CustomerOrderTab
  .Where(o=>o.OrderNo == orderno)
  .Select(o=> o.ToDto());
public static class CustomerOrderTabExtensions {
  public static CustomerOrderDto ToDto(this CustomerOrderTab cot) {
    return new CustomerOrderDto {
      OrderNo = cot.OrderNo,
      ...
      OrderLines = cot.CustomerOrderLines
        .Select(col=>col.ToDto())
        .ToList()
    }
  }
}