ページ

2011年4月5日火曜日

◆LINQでマスターから名称を取得するSelect

PubsデータベースのTitlesテーブルにはPub_Idという外部キー項目があり、それをもとにPublishersテーブルからPub_Nameが取得できる。

20110405203548

マスターやコードテーブルから名称を取ってくるというのはRDBにおいて基本中の基本であり頻出するパターンだ。
SQLで書くならtitlesテーブルとpublishersテーブルをJoinする必要がある。
この程度のJoinなら難しくはないのだが私はいつもSQL本を見ながら書いている。(SQLServerとOracleで書き方が違ったりするので、たまにしかSQLを書かない私にはどうにも覚えられない)

これがLINQを使うと以下のようにいとも簡単に書けるようになる。

  1. using (PubsDataContext pubs = new PubsDataContext())  
  2. {  
  3.     pubs.Log = Console.Out;  
  4.     var titles = pubs.titles.Where(t => t.price > 10)  
  5.                         .Select(t => new  
  6.                         {  
  7.                             t.title,  
  8.                             t.price,  
  9.                             t.publishers.pub_name  
  10.                         });  
  11.     form.dataGridView1.DataSource = titles;  
  12.   
  13. }  


  1. using (PubsDataContext pubs = new PubsDataContext())  
  2. {  
  3.     pubs.Log = Console.Out;  
  4.     var titles = from t in pubs.titles  
  5.                  where t.price > 10  
  6.                  select new  
  7.                         {  
  8.                             t.title,  
  9.                             t.price,  
  10.                             t.publishers.pub_name  
  11.                         };  
  12.     form.dataGridView1.DataSource = titles;  
  13.     Console.Beep();  
  14. }  

発行されたSQLを確認するとちゃんとLEFT OUTER JOINが使われている。


ちなみに、これまで私はなぜかリレーションを張ったDBを使っているシステムを見たことがない。
なので、INNER JOIN したい場合のLINQはどう書けば良いのだろうなどと考えてしまった。

0 件のコメント:

コメントを投稿

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