2016-01-27 21 views
5

Giả sử tôi làm điều gì đó nhưLINQ có biết cách tối ưu hóa "truy vấn" không?

var Ordered = MyList.OrderBy(x => x.prop1).ThenBy(x => x.prop2); 

Liệu MyList.OrderBy(x => x.prop1) trở lại danh sách lọc, và sau đó nó tiếp tục lọc danh sách đó bởi ThenBy(x => x.prop2)? Nói cách khác, nó có tương đương với

var OrderedByProp1 = MyList.OrderBy(x => x.prop1); 
var Ordered = OrderedByProp1.OrderBy(x => x.prop2); 

???

Bởi vì rõ ràng là nó có thể để tối ưu hóa này bằng cách chạy một thuật toán sắp xếp với một so sánh:

var Ordered = MyList.Sort((x,y) => x.prop1 != y.prop1 ? x.prop1 < y.prop1 : (x.prop2 < y.prop2)); 

Nếu có làm một số loại danh sách tối ưu hóa và trung gian không được trả lại trong quá trình này, thì làm sao nó biết làm thế nào để làm điều đó? Làm thế nào để bạn viết một lớp học tối ưu hóa chuỗi các phương pháp trên chính nó? Làm cho không có ý nghĩa.

+0

Hương vị của LINQ là gì? LINQ to Objects, LINQ to Entities, v.v ...? –

+0

Và nếu LINQ to Entities, nhà cung cấp LINQ nào? Có nhiều. Lưu ý rằng có những thay đổi trong EF7 giúp các nhà cung cấp LINQ to Entities dễ dàng hơn trong việc tối ưu hóa các truy vấn. –

+0

Nếu bạn đang kết nối với một cơ sở dữ liệu sử dụng SQL Profiler để so sánh các truy vấn cơ sở dữ liệu được tạo ra trong mỗi trường hợp và xem sự khác biệt là gì (nếu có). – ChrisF

Trả lời

7

Liệu MyList.OrderBy(x => x.prop1) trở lại danh sách lọc

phương pháp số LINQ (ít nhất là thường) trở truy vấn, không phải là kết quả thực hiện những truy vấn.

OrderBy chỉ trả về một đối tượng mà khi bạn yêu cầu một mục, sẽ trả về mục đầu tiên trong bộ sưu tập được đặt hàng cụ thể. Nhưng cho đến khi bạn thực sự yêu cầu nó cho một kết quả nó không làm bất cứ điều gì.

Lưu ý bạn cũng có thể có được một ý tưởng tốt về những gì đang xảy ra bằng cách chỉ xem xét những gì trả về OrderBy. Nó trả về IOrderedEnumerable<T>. Giao diện đó có phương thức CreateOrderedEnumerable trong đó:

Thực hiện thứ tự tiếp theo trên các phần tử của IOrderedEnumerable theo khóa.

Phương thức đó là những gì ThenBy sử dụng để cho biết rằng có thứ tự tiếp theo.

Điều này có nghĩa rằng bạn đang xây dựng tất cả các Người đối chiếu mà bạn muốn được sử dụng, từ OrderBy và tất cả các cuộc gọi ThenBytrước khi bạn cần phải tạo ra một mục duy nhất trong kết quả thiết.

Để biết thêm chi tiết cụ thể về chính xác cách bạn có thể thực hiện hành vi này, hãy xem Jon Skeet's blog series on the subject.

+0

Ngay cả khi Jon Skeet không trả lời câu hỏi, anh ta vẫn trả lời một câu hỏi. –

Các vấn đề liên quan