EF Core 在查询连接后包含孩子
EF Core Include childs after query with joins
我正在使用 .Net Core 2.0 和 EF Core。
以下查询工作正常但不包括 children.
这个查询做的是加入:
- 订单
- OrderItem 和
- 产品
通过将数量(在 OrderItem 中)与价格(在 Product 中)相乘,然后求和,我得到了订单总额。
现在我正在尝试包括 "OrderItem" 和 "Product",因为我希望在我的网站 API 的最后 JSON 中看到它们。因此,获得所有三个实体的最终 JSON 和订单总价的摘要。
这是我的存储库:
public class OrderRepository : IOrderRepository
{
private readonly BasketDbContext _basketDbContext;
public OrderRepository(BasketDbContext basketDbContext)
{
_basketDbContext = basketDbContext;
}
public Order GetOrderById(int id)
{
return (from o in _basketDbContext.Orders
join oi in _basketDbContext.OrderItems on new { o.Id } equals new { Id = oi.OrderId }
join p in _basketDbContext.Products on new { oi.ProductId } equals new { ProductId = p.Id }
where o.Id == id
group new { o, p, oi } by new
{
o.Id,
o.OrderDate
}
into g
select new Order
{
Id = g.Key.Id,
OrderDate = g.Key.OrderDate,
TotalPrice = g.Sum(p => p.p.Price * p.oi.Quantity)
})
.Include(x => x.OrderItems)
.ThenInclude(y => y.Product)
.FirstOrDefault();
}
}
方法 GetOrderById 中的 include 不起作用,但我不知道如何在此类查询中包含这些。
这些是我的模型:
public class Order
{
public int Id { get; set; }
public DateTime OrderDate { get; set; }
public decimal TotalPrice { get; set; }
public List<OrderItem> OrderItems { get; set; }
public decimal CalculateTotal()
{
return OrderItems.Sum(item => item.GetPrice());
}
}
public class OrderItem
{
public int Id { get; set; }
[Required(ErrorMessage = "Empty OrderId")]
public int OrderId { get; set; }
[Required(ErrorMessage = "Empty ProductId")]
public int ProductId { get; set; }
[Required(ErrorMessage = "Empty Quantity")]
[Range(1, 20, ErrorMessage = "Quantity must be between 1 to 20")]
public int Quantity { get; set; }
public Product Product { get; set; }
public decimal GetPrice()
{
return Product.Price * Quantity;
}
}
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public decimal Price { get; set; }
}
谢谢!
您按顺序获取的数据就是您select查询的数据。即 Id、OrderDate 和 TotalPrice:
select new Order
{
Id = g.Key.Id,
OrderDate = g.Key.OrderDate,
TotalPrice = g.Sum(p => p.p.Price * p.oi.Quantity)
})
如果您想在此处映射新订单(如 id、orderDate 等),那么您还必须逐字段映射 "ItemOrder" 和 "Product" 实体。
我认为您可以简单地 return 订购而无需在查询中创建新订单,例如:
return (from o in _basketDbContext.Orders where o.Id == id select o)
.Include(x => x.OrderItems)
.ThenInclude(y => y.Product)
.FirstOrDefault();
可以根据 returned 结果计算 TotalPrice。
我正在使用 .Net Core 2.0 和 EF Core。 以下查询工作正常但不包括 children.
这个查询做的是加入:
- 订单
- OrderItem 和
- 产品
通过将数量(在 OrderItem 中)与价格(在 Product 中)相乘,然后求和,我得到了订单总额。
现在我正在尝试包括 "OrderItem" 和 "Product",因为我希望在我的网站 API 的最后 JSON 中看到它们。因此,获得所有三个实体的最终 JSON 和订单总价的摘要。
这是我的存储库:
public class OrderRepository : IOrderRepository
{
private readonly BasketDbContext _basketDbContext;
public OrderRepository(BasketDbContext basketDbContext)
{
_basketDbContext = basketDbContext;
}
public Order GetOrderById(int id)
{
return (from o in _basketDbContext.Orders
join oi in _basketDbContext.OrderItems on new { o.Id } equals new { Id = oi.OrderId }
join p in _basketDbContext.Products on new { oi.ProductId } equals new { ProductId = p.Id }
where o.Id == id
group new { o, p, oi } by new
{
o.Id,
o.OrderDate
}
into g
select new Order
{
Id = g.Key.Id,
OrderDate = g.Key.OrderDate,
TotalPrice = g.Sum(p => p.p.Price * p.oi.Quantity)
})
.Include(x => x.OrderItems)
.ThenInclude(y => y.Product)
.FirstOrDefault();
}
}
方法 GetOrderById 中的 include 不起作用,但我不知道如何在此类查询中包含这些。
这些是我的模型:
public class Order
{
public int Id { get; set; }
public DateTime OrderDate { get; set; }
public decimal TotalPrice { get; set; }
public List<OrderItem> OrderItems { get; set; }
public decimal CalculateTotal()
{
return OrderItems.Sum(item => item.GetPrice());
}
}
public class OrderItem
{
public int Id { get; set; }
[Required(ErrorMessage = "Empty OrderId")]
public int OrderId { get; set; }
[Required(ErrorMessage = "Empty ProductId")]
public int ProductId { get; set; }
[Required(ErrorMessage = "Empty Quantity")]
[Range(1, 20, ErrorMessage = "Quantity must be between 1 to 20")]
public int Quantity { get; set; }
public Product Product { get; set; }
public decimal GetPrice()
{
return Product.Price * Quantity;
}
}
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public decimal Price { get; set; }
}
谢谢!
您按顺序获取的数据就是您select查询的数据。即 Id、OrderDate 和 TotalPrice:
select new Order
{
Id = g.Key.Id,
OrderDate = g.Key.OrderDate,
TotalPrice = g.Sum(p => p.p.Price * p.oi.Quantity)
})
如果您想在此处映射新订单(如 id、orderDate 等),那么您还必须逐字段映射 "ItemOrder" 和 "Product" 实体。
我认为您可以简单地 return 订购而无需在查询中创建新订单,例如:
return (from o in _basketDbContext.Orders where o.Id == id select o)
.Include(x => x.OrderItems)
.ThenInclude(y => y.Product)
.FirstOrDefault();
可以根据 returned 结果计算 TotalPrice。