Chúng tôi đang đối mặt với một vấn đề hiệu năng lớn sau khi nâng cấp EF Core 2.2 lên EF Core 3.0. Hãy tưởng tượng một mô hình dữ liệu đơn giản với một thuộc tính điều hướng bộ sưu tập duy nhất và hàng trăm trường (thực tế trông còn tối hơn):
public class Item
{
[Key]
public int ItemID {get;set;}
public ICollection<AddInfo> AddInfos {get;set;}
... // consisting of another 100+ properties!
}
và
public class AddInfo
{
[Key]
public int AddInfoID {get;set;}
public int? ItemID {get;set;}
public string SomePayload {get;set;}
}
Trong quá trình truy xuất mục, chúng tôi truy vấn như sau:
...
var myQueryable = this._context.Items.Include(i => i.AddInfos).Where(**some filter**);
... // moar filters
var result = myQueryable.ToList();
Thẳng về phía trước, cho đến thời điểm này.
Trong EF 2.2, tìm nạp kết quả có thể truy vấn đó trong hai truy vấn riêng biệt, một cho Item
và một cho AddInfo
cấp -. Các truy vấn này thường lấy 10.000 items
và khoảng 250.000 AddInfos
.
Trong EF Lõi 3.0 tuy nhiên, một truy vấn duy nhất đã được tạo ra, trái tham gia AddInfo
để Item
mà trên xuất hiện cái nhìn đầu tiên là lựa chọn tốt hơn. Item
Tuy nhiên, chúng tôi cần phải tìm nạp tất cả hơn 100 trường, đó là lý do tại sao chiếu đến một lớp nhỏ hơn hoặc loại ẩn danh (thêm một cuộc gọi vào phương thức .Select (...) - không khả thi. Do đó, tập kết quả có quá nhiều sự dư thừa trong đó (mỗi lần Item
xấp xỉ 25 lần) mà bản thân truy vấn mất quá nhiều thời gian để chạy trong thời gian chấp nhận được.
Có phải EF-Core 3.0 cung cấp bất kỳ tùy chọn nào cho phép chúng tôi quay lại hành vi truy vấn của EF Core cũ 2.2 tốt mà không cần thay đổi nhiều đối với mô hình dữ liệu của chúng tôi không? Chúng tôi đã thu được lợi nhuận từ sự thay đổi này trong các phần khác của ứng dụng, nhưng không phải trong kịch bản cụ thể này.
Rất cám ơn trước!
Cập nhật
Sau khi điều tra thêm, tôi thấy rằng vấn đề này đã được xử lý với Microsoft ở đây và ngoài hộp, dường như không có cách nào để định cấu hình thực thi truy vấn phân tách.