I'm struggling with net core returning truncated response. I have already defined no reference loop in my startup services, and also tried to set compatibility version for the version i'm currently using 2.1 as follows:
services.AddMvc()
        .SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
        .AddJsonOptions(x => x.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore);
I also tried to serialize the array using JsonConvert and it did not throw any reference loop exception. Here's the action in the controller and the serializedArray text:
 public IActionResult GetProductItems(int productId)
 {
     try
     {
         var productItems = _productsMethods.GetProductItems(productId);
         // for testing the object for ref loops
         string serialized = Newtonsoft.Json.JsonConvert.SerializeObject(productItems);
         return Ok(productItems);
     }
     catch (ClientException ex)
     {
         return BadRequest(new { message = ex.Message });
     }
     catch (Exception ex)
     {
         return StatusCode(500, new { message = ex.Message });
     }
 }
// serialized string
//[{"ID":2,"ProductId":6,"ItemId":4,"Product":null,"Item":null,"Orders":[]},{"ID":3,"ProductId":":6,"ItemId":1,"Product":null,"Item":null,"Orders":[]},{"ID":5,"ProductId":":6,"ItemId":2,"Product":null,"Item":null,"Orders":[]}]
Here's the actual response
[{"id":2,"productId":6,"itemId":4,"product":null,"item":null,"orders":
Method:
public List<ProductItem> GetProductItems(int productId)
{
    IQueryable<DataSets.ProductItem> query = db.ProductItems
        .AsNoTracking()
        .Include(k => k.Orders)
        .Where(k => k.ProductId == productId);
    // result truncated (when array orders is empty)
    //return query.Select(_mapper.Map<ProductItem>).ToList();
    // without automapper, also truncated
    //return query.Select(k => new ProductItem()
    //{
    //    ID = k.ID,
    //    ItemId = k.ItemId,
    //    ProductId = k.ProductId,
    //    Orders = k.Orders.Select(a => new Order() { ID = a.ID })
    //    .ToList()
    //}).ToList();
    // WORKS, not getting truncated 
    // order not included 
    return query.Select(k => new ProductItem()
    {
        ID = k.ID,
        ItemId = k.ItemId,
        ProductId = k.ProductId,
    }).ToList();
}
Entities (renamed and removed props for simplification):
public class Product
{
    public int ID { get; set; }
  
    // some props
    public string UserId { get; set; }
    public User User { get; set; }
    public List<ProductItem> Items { get; set; }
}
public class ProductItem
{
    public int ID { get; set; }
    // some props
    public int ProductId { get; set; }
    public int ItemId { get; set; }
    public Product Product { get; set; }
    public Item Item { get; set; }
    public List<Order> Orders { get; set; }
}
public class Order
{
    public int ID { get; set; }
    
    // some props
    public int ItemId { get; set; }
    public ProductItemOrder Item { get; set; }
}
Since there is no reference loop in orders and also the reference loop is ignored. Why is this still truncating?