我有以下型号:
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;}
}
我有Order
和OrderLine
类的映射配置,但没有CustomerOrder
的映射配置,因为我认为我可以将数据投射到此类中。
我可以:
使用EF通过指定包含来检索数据。检索数据后,我可以将其投影到CustomerOrder
类中。但是,这会强制EF检索主表和包含表的所有列吗?
使用自定义SQL查询从Order
表中检索所需的详细信息(可能直接从视图中)。使用Linq将此结果集与OrderLine
连接以进行完整投影。但是,我是否需要为视图配置映射?
为避免过多的列并加入SQL select语句,将数据投影到CustomerOrder
的最佳方法是什么?
答案 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(数据传输对象))。