Tôi có một phương pháp trên lớp một phần tạo ra tôi như thế này:.Skip() Take() trên Entity Framework Navigation Thuộc tính đang thực hiện SELECT * trên của tôi SQL Server
var pChildren = this.Children
.Skip(skipRelated)
.Take(takeRelated)
.ToList();
Khi tôi nhìn vào SQL Server của tôi , Tôi có thể thấy mã được tạo đang thực hiện SELECT *.* FROM Children
Mã này được lấy trực tiếp từ lớp của tôi, tôi đã xác minh rằng thứ tự Bỏ qua/Thực hiện của tôi là TRƯỚC KHI .ToList của tôi.
Nếu tôi loại bỏ .ToList, dòng đó nhanh (và không có SQL được gửi đến DB của tôi), nhưng thời điểm tôi cố gắng foreach
qua kết quả, tôi nhận được cùng một SQL được gửi đến DB của tôi: SELECT *.* FROM Children
.
Có điều gì đặc biệt tôi cần phải làm khi sử dụng .Skip và .Take trên thuộc tính điều hướng đối tượng của tôi?
cập nhật
Tôi sẽ cố gắng để có được SQL thực tế tạo ra, Tôi hiện đang không thiết lập cho điều đó. Tôi tìm thấy cái đầu tiên bởi vì nó xuất hiện trong danh sách "truy vấn đắt tiền" của SSMS.
Chạy này:
var pChildren = this.Children
//.Skip(skipRelated)
//.Take(takeRelated)
.ToList();
lợi nhuận ~ 4.000.000 hàng và mất ~ 25 giây.
Chạy này:
var pChildren = this.Children
//.Skip(skipRelated)
.Take(takeRelated)
.ToList();
lợi nhuận ~ 4.000.000 hàng và mất ~ 25 giây.
Như tôi đã nói, tôi sẽ lấy SQL được tạo cho chúng và đặt chúng lên.
SQL Những gì bạn đã mong đợi đoạn mã này để tạo ra? – cdhowie
Tôi đã hy vọng cho một cái gì đó giống như 'SELECT TOP 10 TỪ trẻ em WHERE ParentID = @ idOfParentEntity' (Tôi quên cách EF xử lý .Sip, nhưng tôi đã đọc nó là nghĩa vụ phải. Nếu tôi thực hiện truy vấn này đối với bối cảnh của tôi trực tiếp nó xuất hiện để giới hạn dữ liệu được trả về một "trang" cụ thể) – Nate
Sự hiện diện của '.Skip()' ngăn cản việc sử dụng 'TOP'. Trừ khi bạn mong đợi nó để tổng hợp 'skipRelated' và' takeRelated' và sử dụng nó như tham số 'TOP' ... có thể là một tối ưu hóa, nhưng nó cũng có thể không có tác động đến hiệu suất. – cdhowie