Đang cố gắng để cung cấp cho bạn một câu trả lời ngắn gọn để nghi ngờ của bạn, nếu bạn thực hiện các phương pháp trên skip(n).take(m)
LINQ (với SQL 2005/2008 như máy chủ cơ sở dữ liệu) truy vấn của bạn sẽ đang sử dụng câu lệnh Select ROW_NUMBER() Over ...
, với phân trang trực tiếp bằng cách nào đó trong công cụ SQL.
Đem lại cho bạn một ví dụ, tôi có một bảng db gọi mtcity
và tôi đã viết các truy vấn sau đây (công việc cũng như với LINQ to Entities):
using (DataClasses1DataContext c = new DataClasses1DataContext())
{
var query = (from MtCity2 c1 in c.MtCity2s
select c1).Skip(3).Take(3);
//Doing something with the query.
}
Các kết quả truy vấn sẽ là:
SELECT [t1].[CodCity],
[t1].[CodCountry],
[t1].[CodRegion],
[t1].[Name],
[t1].[Code]
FROM (
SELECT ROW_NUMBER() OVER (
ORDER BY [t0].[CodCity],
[t0].[CodCountry],
[t0].[CodRegion],
[t0].[Name],
[t0].[Code]) AS [ROW_NUMBER],
[t0].[CodCity],
[t0].[CodCountry],
[t0].[CodRegion],
[t0].[Name],
[t0].[Code]
FROM [dbo].[MtCity] AS [t0]
) AS [t1]
WHERE [t1].[ROW_NUMBER] BETWEEN @p0 + 1 AND @p0 + @p1
ORDER BY [t1].[ROW_NUMBER]
Đó là quyền truy cập dữ liệu cửa sổ (khá thú vị, btw cuz sẽ trả về dữ liệu kể từ khi bắt đầu và sẽ truy cập vào bảng miễn là đáp ứng các điều kiện). Điều này sẽ rất giống với:
With CityEntities As
(
Select ROW_NUMBER() Over (Order By CodCity) As Row,
CodCity //here is only accessed by the Index as CodCity is the primary
From dbo.mtcity
)
Select [t0].[CodCity],
[t0].[CodCountry],
[t0].[CodRegion],
[t0].[Name],
[t0].[Code]
From CityEntities c
Inner Join dbo.MtCity t0 on c.CodCity = t0.CodCity
Where c.Row Between @p0 + 1 AND @p0 + @p1
Order By c.Row Asc
Với ngoại lệ, truy vấn thứ hai này sẽ được thực hiện độc quyền để tạo cửa sổ truy cập dữ liệu; điều này có nghĩa, nếu bạn cần lọc, bộ lọc nên (hoặc phải) trong danh sách Thực thể (nơi hàng được tạo) và một số chỉ mục cũng sẽ được tạo để duy trì hiệu suất tốt.
Bây giờ, còn gì tốt hơn?
Nếu bạn có khá nhiều công việc vững chắc trong logic của mình, việc triển khai đúng cách SQL sẽ phức tạp. Trong trường hợp đó LINQ sẽ là giải pháp.
Nếu bạn có thể giảm phần logic trực tiếp xuống SQL (trong thủ tục đã lưu), nó sẽ còn tốt hơn vì bạn có thể thực hiện truy vấn thứ hai mà tôi đã chỉ cho bạn (sử dụng chỉ mục) và cho phép SQL tạo và lưu trữ Kế hoạch thực hiện truy vấn (cải thiện hiệu suất).
Tôi nghĩ điều đó phụ thuộc. Bạn đang làm việc với ứng dụng nào? loại tải nó sẽ có? – BuddyJoe
Hãy xem câu trả lời này: http: // stackoverflow.com/a/10639172/416996 –
Hãy xem điều này cũng http://www.aspsnippets.com/Articles/Custom-Paging-in-ASP.Net-GridView-using-SQL-Server-Stored-Procedure.aspx –