ページ

2011年4月6日水曜日

◆LINQで読み飛ばし処理

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

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

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

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


  1. 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]  
  2. FROM (  
  3.     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]  
  4.     FROM [dbo].[Orders] AS [t0]  
  5.     ) AS [t1]  
  6. WHERE [t1].[ROW_NUMBER] BETWEEN @p0 + 1 AND @p0 + @p1  
  7. ORDER BY [t1].[ROW_NUMBER]  
  8. -- @p0: Input Int (Size = -1; Prec = 0; Scale = 0) [3]  
  9. -- @p1: Input Int (Size = -1; Prec = 0; Scale = 0) [5]  
  10. -- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 4.0.30319.1  

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

0 件のコメント:

コメントを投稿

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