将实体模型转换为C#MVC中的模型

将实体模型转换为C#MVC中的模型,c#,asp.net-mvc,linq,model,linqkit,C#,Asp.net Mvc,Linq,Model,Linqkit,假设我有两个数据库表:Order和OrderLine 据认为,创建数据库模型的副本并使用它们而不是数据库模型是一种良好的做法 您通常会看到这样的转换器方法 public OrderModel ToOrderModel(Order order) { return new OrderModel { OrderID = order.OrderID, Customer = order.CustomerName, OrderLines = o

假设我有两个数据库表:Order和OrderLine

据认为,创建数据库模型的副本并使用它们而不是数据库模型是一种良好的做法

您通常会看到这样的转换器方法

public OrderModel ToOrderModel(Order order)
{
    return new OrderModel
    {
        OrderID = order.OrderID,
        Customer = order.CustomerName,
        OrderLines = order.OrderLines
    };
}

public OrderLineModel ToOrderLineModel(OrderLine orderLine)
{
    return new OrderLineModel
    {
        OrderLineID = orderLine.OrderLineID,
        Quantity = orderLine.Quantity,
        Product = orderLine.ProductName,
        Order = orderLine.Order
    };
}

在我看来,这方面的问题在于:

  • OrderModel
    中的
    OrderLines
    属性是类型
    OrderLine
    的列表,而不是
    OrderLineModel
  • OrderLineModel
    中的
    Order
    属性属于
    Order
    类型,而不是
    OrderModel
我已经找到了两种解决方案,但都有其局限性,我希望有人能提出更好的方法

解决方案1 此解决方案有效,但它仅在“LINQ到对象”中有效,而在“LINQ到实体”中无效。 这也有点太复杂了

public OrderModel ToOrderModel(Order order)
{
    return ToOrderModel(order, null);
}

private OrderModel ToOrderModel(Order order, List<OrderLineModel> orderLines )
{
    //Creating model early so that we have a reference to pass later on
    var orderModel = new OrderModel();

    orderModel = new OrderModel()
    {
        OrderID = order.OrderID,
        Customer = order.CustomerName,
        OrderLines = orderLines ?? order.Lines.ToList().Select(x => ToOrderLineModel(x, orderModel)) 
    };
}

public OrderLineModel ToOrderLineModel(OrderLine orderLine)
{
    return ToOrderLineModel(orderLine, null);
}

private OrderLineModel ToOrderLineModel(OrderLine orderLine, OrderModel orderModel)
{
    //Creating model early so that we have a reference to pass later on    
    var orderLineModel = new OrderLineModel();

    return new OrderLineModel
    {
        OrderLineID = orderLine.OrderLineID,
        Quantity = orderLine.Quantity,
        Product = orderLine.ProductName,
        Order = orderModel ?? ToOrderModel(orderLine.OrderModel, orderLineModel),
    };
}
有人对我有什么建议吗


提前谢谢你

一个词:AutoMapper。检查此答案与你想要实现的答案相同。一个词:AutoMapper。检查此答案与你想要实现的答案相同。
 public static Expression<Func<Order, OrderModel>> ToOrderModel =
    order => new OrderModel()
    {
        OrderID = order.OrderID,
        Customer = order.CustomerName,
        Lines = order.OrderLines.Select(orderLine => ToJournalLineModel.Invoke(orderLine)),
    };

public static Expression<Func<OrderLine, OrderLineModel>> ToOrderLineModel =
    orderLine => new OrderLineModel()
    {
        OrderLineID = orderLine.OrderLineID,
        Quantity = orderLine.Quantity,
        Product = orderLine.ProductName,
        //Sadly we can't add an OrderModel here :(
    };

//example usage
var orderModels = dbContext.Orders.AsExpandable().Select(ToOrderModel);