Tôi đã có truy vấn LINQ tải một hệ thống phân cấp các đối tượng như sau.EF Ở đâu (x => x.ColumnVal == 1) vs FirstOrDefault (x => x.Column == 1)
Query # 1
var result = db.Orders
.Include("Customer")
// many other .Include() here
.FirstOrDefault(x => x.Customer.CustomerId == 1 &&
x.OrderId == orderId);
Tôi đã có MAJOR vấn đề hiệu suất với nó.
Mức sử dụng CPU gần 100% và mức sử dụng bộ nhớ rất cao.
Và tôi đã chỉnh sửa nó thành vấn đề sau và sự cố hiệu suất đã được khắc phục.
Query # 2
var result = db.Orders
.Include("Customer")
// many other .Include() here
.Where(x => x.Customer.CustomerId == 1 &&
x.OrderId == orderId)
.FirstOrDefault();
Tôi chỉ muốn xác nhận sự nghi ngờ của tôi.
Query # 1 có lẽ là vòng lặp qua tất cả hồ sơ của tôi trong bộ nhớ tìm kiếm một bản ghi tương ứng
vs
Query # 2 lọc các hồ sơ trên cơ sở dữ liệu và sau đó nhận được kỷ lục đầu tiên mà thôi.
Đó có phải là lý do tại sao Truy vấn # 1 có vấn đề về hiệu suất?
Để an toàn, tôi có cần sử dụng số .Select(x => x)
trước .FirstOrDefault()
không?
Query # 3
var result = db.Orders
.Include("Customer")
// many other .Include() here
.Where(x => x.Customer.CustomerId == 1 &&
x.OrderId == orderId)
.Select(x => x)
.FirstOrDefault();
Tôi đồng ý với những suy nghĩ ban đầu của bạn. Quan sát các truy vấn được tạo ra và đặt tâm trí của bạn để nghỉ ngơi :-) –