Nó làm tốt nhất có thể.
Vì bạn dường như đang sử dụng SQL Server và công cụ của nó biết về SQL Server có một TOP
, nó sẽ sử dụng nó. Nó cũng sẽ sử dụng nó với MS Access.
Nếu bạn đang sử dụng PostgreSQL, MySQL hoặc SQL Lite, nó sẽ sử dụng LIMIT
.
Nó cũng có thể sử dụng "fetch first " + n + " rows only"
(kiểu chuẩn DB2 và SQL: 2008) hoặc "select first " + n + "from"
(kiểu Informix) hoặc "select * from (" + restOfQuery + ") where rownum <= " + n
trên Oracle hoặc bất kỳ cơ sở dữ liệu nào cần thiết.
Và nếu ai đó đã viết một công cụ cho cơ sở dữ liệu hoàn toàn không thể hỗ trợ các giới hạn đó thì thực sự có thể đóng luồng kết quả sau khi đã thực hiện những gì cần thiết.
Dù bằng cách nào, cách tốt nhất có thể trong trường hợp cụ thể.
Nó cũng có, tình cờ, sử dụng phương pháp tương tự với một giá trị của 1
cho First()
và các biến thể của nó và với một giá trị của 2
cho Single()
và các biến thể của nó (vì bạn cần phải cố gắng để mất ít nhất 2 hàng để kiểm tra rằng có chỉ có 1 để lấy).
Nguồn
2015-06-24 10:04:03
Bạn có thể sử dụng SQL Profiler để xem SQL nó tạo ra cho chính mình. Giả sử bạn gọi .Take() trên một IQueryable nó sẽ thực hiện một TOP N đối với SQL Server. Tôi luôn sử dụng profiler để đảm bảo rằng LINQ-SQL/Entities tạo ra một nửa SQL khá. – DaveShaw
Điều gì 'Take()' phụ thuộc vào việc bạn đang sử dụng cơ sở dữ liệu nào và cách bạn sử dụng nó. Tất cả những thứ phổ biến tôi đã sử dụng đều làm đúng. –
Bạn đang sử dụng "LINQ" nào? LINQ to SQL? Khuôn khổ thực? –