ページ

2011年4月10日日曜日

◆LINQでの内部結合(Join)処理

基本的にリレーションが張られたテーブル間でJoin処理は不要なのだが、中にはリレーションが張られていない場合もある。(ちなみに私の周りではみんな張っていない)
そのような場合は自分でJoinでくっつけて参照する必要がある。
まぁ、通常SQLではそうやっているので違和感は無い。
また、Linq to DataSetなどの場合も自分でJoinする必要がありそうだ。

以下の例ではNorthWindのOrderとEmployeeをJoinしている。(本来はリレーションが張られているので必要ない)

  1. //内部結合(Join)処理  
  2. public void linqJoin(Form1 form)  
  3. {  
  4.     using (NorthWindDataContext nwnd = new NorthWindDataContext())  
  5.     {  
  6.         nwnd.Log = Console.Out;  
  7.         var orderEmp = nwnd.Order.Join(nwnd.Employees, o => o.EmployeeID, e => e.EmployeeID,  
  8.             (o, e) => new  
  9.             {  
  10.                 o.OrderID,  
  11.                 o.OrderDate,  
  12.                 orderemployee = e.LastName + " " + e.FirstName  
  13.             });  
  14.         form.dataGridView1.DataSource = orderEmp;  
  15.     }  
  16. }  

ん~、いまひとつピンとこない文法だ。


埋め込みクエリー方式で書くと以下の通り。



  1. //内部結合(Join)処理  
  2. public void linqJoin(Form1 form)  
  3. {  
  4.     using (NorthWindDataContext nwnd = new NorthWindDataContext())  
  5.     {  
  6.         var orderEmp = from o in nwnd.Order   
  7.                        join e in nwnd.Employees  
  8.                        on o.EmployeeID equals e.EmployeeID  
  9.                        select new  
  10.                         {  
  11.                             o.OrderID,  
  12.                             o.OrderDate,  
  13.                             orderemployee = e.LastName + " " + e.FirstName  
  14.                         };  
  15.         form.dataGridView1.DataSource = orderEmp;  
  16.         Console.Beep();  
  17.         //Joinを使わない書き方  
  18.         orderEmp = from o in nwnd.Order  
  19.                    from e in nwnd.Employees  
  20.                    where o.EmployeeID == e.EmployeeID  
  21.                    select new  
  22.                    {  
  23.                        o.OrderID,  
  24.                        o.OrderDate,  
  25.                        orderemployee = e.LastName + " " + e.FirstName  
  26.                    };  
  27.      
  28.     }  


珍しくこちらのほうが判り易い。
Joinを使わない書き方が一番すっきりとして判り易い気がする。

0 件のコメント:

コメントを投稿

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