Cercando di dare una breve risposta al vostro dubbio, se si esegue i metodi skip(n).take(m)
su LINQ (con SQL 2005/2008 come server di database) la vostra richiesta sarà sta usando l'istruzione Select ROW_NUMBER() Over ...
, con è in qualche modo il paging diretto nel motore SQL.
Dare un esempio, ho una tabella db chiamato mtcity
e ho scritto la seguente query (lavoro così con LINQ to entità):
using (DataClasses1DataContext c = new DataClasses1DataContext())
{
var query = (from MtCity2 c1 in c.MtCity2s
select c1).Skip(3).Take(3);
//Doing something with the query.
}
La query risultante sarà:
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]
Quale è un accesso ai dati con finestra (piuttosto interessante, btw cuz restituirà i dati sin dall'inizio e accederà alla tabella finché le condizioni saranno soddisfatte). Questo sarà molto simile a:
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
Con l'eccezione che, questa seconda query viene eseguita più veloce del risultato LINQ perché sarà utilizzato esclusivamente l'indice per creare la finestra di accesso ai dati; questo significa che se hai bisogno di un filtro, il filtro deve essere (o deve essere) nell'elenco Entity (dove viene creata la riga) e alcuni indici dovrebbero essere creati per mantenere le buone prestazioni.
Ora, che cosa è meglio?
Se si dispone di un solido flusso di lavoro nella logica, l'implementazione del corretto modo SQL sarà complicata. In tal caso LINQ sarà la soluzione.
Se è possibile abbassare quella parte della logica direttamente su SQL (in una stored procedure), sarà ancora meglio perché è possibile implementare la seconda query che ho mostrato (utilizzando gli indici) e consentire a SQL di generare e archiviare la parte Piano di esecuzione della query (miglioramento delle prestazioni).
Penso che dipenda. Su cosa stai lavorando? che tipo di carico avrà? – BuddyJoe
Dai un'occhiata anche a questa risposta: http: // StackOverflow.it/a/10639172/416996 –
Dai un'occhiata anche a http://www.aspsnippets.com/Articles/Custom-Paging-in-ASP.Net-GridView-using-SQL-Server-Stored-Procedure.aspx –