高效分頁實現:LINQ 的 Skip()/Take() 與自訂 SQL 的效率比較
在分頁實作中,您可能需要在 LINQ 的 Skip()
和 Take()
方法以及自訂 SQL 分頁方案之間做出選擇。本文將分析兩種方法的效率和優勢,幫助您做出最佳決策。
LINQ 的 Skip() 和 Take() 方法
LINQ 提供了一種簡潔的分頁實作方式。 Skip()
方法跳過指定行數,Take()
方法取得後續指定行數,以便輕鬆實現分頁。在 SQL Server 2008 及更高版本中,這些方法利用 ROW_NUMBER()
函數,在 SQL 引擎內部直接進行分頁。
例如,以下 LINQ 查詢:
<code class="language-csharp">var query = (from c1 in c.MtCity2s select c1).Skip(3).Take(3);</code>
會轉換成以下 SQL 語句:
<code class="language-sql">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]</code>
此查詢展示了 SQL 的視窗化資料存取方式,它能夠立即開始傳回數據,並根據指定條件繼續存取表。
自訂 SQL 分頁實作
另一種方法是建立自訂的基於 SQL 的分頁機制。為了提高效能,您可以使用預存程序來封裝邏輯,並在適當的時候利用索引。例如下:
<code class="language-sql">With CityEntities As ( Select ROW_NUMBER() Over (Order By CodCity) As Row, CodCity 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</code>
此查詢建立一個名為 CityEntities 的記憶體表,其中包含 mtcity
表中每一行的行號。透過在 CodCity
列上使用索引,查詢可以有效地檢索所需的行。
選擇最有效的方法
這兩種方法的選擇很大程度取決於您的邏輯複雜性。如果您的工作流程相對簡單,LINQ 方法就足夠了。但是,對於更複雜的邏輯,實現您自己的基於 SQL 的分頁解決方案可能更有效率和靈活。
以上是LINQ 的 Skip()/Take() 與自訂 SQL:哪一種分頁方法提供較好的效率?的詳細內容。更多資訊請關注PHP中文網其他相關文章!