ページ

2011年4月6日水曜日

◆LINQで読み飛ばし処理

テーブルをキー順で並べておいて何件目から何件という風にデータを取ってくる処理。
WEBページをスクロールするときに1ページ分のデータを取得するときのようなイメージだ。

OrderBy拡張メソッドでソートしておいてSkipで読み飛ばしTakeで指定した件数だけ持ってくるといった処理になる。

        //読み飛ばし処理
public void linqSkipTake(Form1 form)
{
using (NorthWindDataContext nwnd = new NorthWindDataContext())
{
nwnd.Log = Console.Out;
var orders = nwnd.Order.OrderBy(o => o.OrderID).Skip(3).Take(5);
form.dataGridView1.DataSource = orders;
}
}

ちなみに発行されているSQLはこんな感じになっている。


SELECT [t1].[OrderID], [t1].[CustomerID], [t1].[EmployeeID], [t1].[OrderDate], [t1].[RequiredDate], [t1].[ShippedDate], [t1].[ShipVia], [t1].[Freight], [t1].[ShipName], [t1].[ShipAddress], [t1].[ShipCity], [t1].[ShipRegion], [t1].[ShipPostalCode], [t1].[ShipCountry]
FROM (
SELECT ROW_NUMBER() OVER (ORDER BY [t0].[OrderID]) AS [ROW_NUMBER], [t0].[OrderID], [t0].[CustomerID], [t0].[EmployeeID], [t0].[OrderDate], [t0].[RequiredDate], [t0].[ShippedDate], [t0].[ShipVia], [t0].[Freight], [t0].[ShipName], [t0].[ShipAddress], [t0].[ShipCity], [t0].[ShipRegion], [t0].[ShipPostalCode], [t0].[ShipCountry]
FROM [dbo].[Orders] AS [t0]
) AS [t1]
WHERE [t1].[ROW_NUMBER] BETWEEN @p0 + 1 AND @p0 + @p1
ORDER BY [t1].[ROW_NUMBER]
-- @p0: Input Int (Size = -1; Prec = 0; Scale = 0) [3]
-- @p1: Input Int (Size = -1; Prec = 0; Scale = 0) [5]
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 4.0.30319.1

はっきり言って私にゃチンプンカンプン。
処理速度的にこれが最適か?って話は別として、お気楽プログラマーにとってLINQって素晴らしい。(^^;

0 件のコメント:

コメントを投稿

私が最近チェックした記事