我使用EF核心和.NET核2.0。
我有这样的实体层次结构:
订购
OrderItem
我在服务中的LINQ查询有效,但是只返回一个OrderItem,而我有5个。它也很好地返回了该OrderItem的产品。 所以我想要的是,修改此查询以实际上包括特定订单ID的所有OrderItem,而不仅仅是第一项。我期望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; }
public int OrderId { get; set; }
public int ProductId { get; set; }
public int Quantity { get; set; }
public Product Product { get; set; }
public Order Order{ 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; }
}
这是带有查询的服务:
public class OrderRepository: IOrderRepository
{
private readonly BasketDbContext _basketDbContext;
public OrderRepository(BasketDbContext basketDbContext)
{
_basketDbContext = basketDbContext;
}
public IEnumerable<Order> GetAllOrders()
{
return _basketDbContext.Orders
.Include(x => x.OrderItems)
.ThenInclude(y => y.Product).ToList();
}
}
和这是我的JSON从方法GetAllOrders得到:
[
{
"id":1,
"orderDate":"2019-02-02T11:24:36.103",
"totalPrice":0.0000,
"orderItems":[
{
"id":1,
"orderId":1,
"productId":1,
"quantity":1,
"product":{
"id":1,
"name":"Samsung Galaxy S8 64GB",
"description":"5.8-Inch, Dual pixel 12MP camera",
"price":390.0000
}
如您所见,JSON的格式也不正确,它不会关闭初始的[{。
我做错了什么? 感谢您的帮助
答案 0 :(得分:2)
这似乎在序列化的最后一步中,您的序列化程序无法继续执行,因此仅退出而ASP.NET Core将未完成的响应发送给客户端。可能是由于您从OrderItem
到Order
的反向引用而发生的。假设您正在使用Newtonsoft的Json.NET,请尝试在ReferenceLoopHandling = ReferenceLoopHandling.Ignore
中将JsonSerializerSettings设置为Startup.cs
。
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc()
.AddJsonOptions(
o => o.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore
);
}
另一种选择是简单地将Order
中的OrderItem
从序列化中排除,例如通过[JsonIgnore]
属性,当然,这意味着它永远不会出现在您的任何响应中。