使用Linq使用EntitySet加入动态查询结果?

时间:2016-08-30 18:44:43

标签: c# entity-framework linq

我有以下型号:

public class Order
{
    public int Id {get; set;}
    public int CustomerId {get; set;}
    public virtual Category Category {get; set;}
    //Many more properties...
}

public class OrderLine
{
    public int Id {get; set;}
    public int OrderId {get; set;}
    public virtual Order Order {get; set;}
    public virtual Product Product {get; set;}
    //Other properties...
}

我需要获得特定客户的订单。为了不检索太多信息,我创建了一个类:

public class CustomerOrder
{
    public int CustomerId {get; set;}
    public int OrderId {get; set;}
    public string ProductName {get; set;}
    public virtual ICollection<OrderLine> {get; set;}
}

我有OrderOrderLine类的映射配置,但没有CustomerOrder的映射配置,因为我认为我可以将数据投射到此类中。

我可以:

  1. 使用EF通过指定包含来检索数据。检索数据后,我可以将其投影到CustomerOrder类中。但是,这会强制EF检索主表和包含表的所有列吗?

  2. 使用自定义SQL查询从Order表中检索所需的详细信息(可能直接从视图中)。使用Linq将此结果集与OrderLine连接以进行完整投影。但是,我是否需要为视图配置映射?

  3. 为避免过多的列并加入SQL select语句,将数据投影到CustomerOrder的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

你可以按照下图所示进行操作。你也必须对你的模型进行一些更改。我已经这样做了。请看一下。

 public class Order
    {
        public int Id {get; set;}
        public int CustomerId {get; set;}
        public virtual Category Category {get; set;}
        public virtual ICollection <OrderLine> OrderLines {get; set;}

        //Many more properties...
    }

public class OrderLine
{
    public int Id {get; set;}
    public int OrderId {get; set;}
    public virtual Order Order {get; set;}
    public virtual Product Product {get; set;}

    //Other properties...
}

public class CustomerOrder
{
    public int CustomerId {get; set;}
    public int OrderId {get; set;}
    public string ProductName {get; set;}
    public virtual ICollection<OrderLine> OrderLines {get; set;}
}

最终查询:

var orderList = (from order in _context.Orders
                 from orderLine in order.OrderLines)
                 select new CustomerOrder
                   {
                      CustomerId = order.CustomerId,
                      OrderId = orderLine.OrderId,
                      ProductName= orderLine.Product.ProductName,
                      OrderLines = order.OrderLines
                    }).AsNoTracking().ToList();

A 1:否。只会从数据库中提取预计列。

最佳方法: 始终使用自定义投影(如CustomerOrder)。当我们考虑EF查询的效果时,这是最好的。您可以用它来发送数据到视图(它就像一个DTO(数据传输对象))。