LINQ解説 2「LINQ to SQL」- C# 3.0 (dotnet 3.5) - システム開発・導入全般 - 専門家プロファイル

上原 正吉
株式会社アースリンクネットワーク 
Webプロデューサー

注目の専門家コラムランキングRSS

対象:システム開発・導入

清水 圭一
清水 圭一
(IT経営コンサルタント)
井上 みやび子
井上 みやび子
(Webエンジニア)
井上 みやび子
井上 みやび子
(Webエンジニア)

閲覧数順 2016年12月07日更新

専門家の皆様へ 専門家プロファイルでは、さまざまなジャンルの専門家を募集しています。
出展をご検討の方はお気軽にご請求ください。

LINQ解説 2「LINQ to SQL」- C# 3.0 (dotnet 3.5)

- good

  1. 法人・ビジネス
  2. システム開発・導入
  3. システム開発・導入全般
C# .Net 開発 LINQ解説
図1 クリックで拡大                     図2 クリックで拡大


*LINQ解説 2 「LINQ to SQL」- C# 3.0 Visual Studio 2008

それでは、LINQを説明していこう。

まずは次のソースを見ていただきたい。


**通常のコード

1: SqlCommand comSelect = new SqlCommand();
2:
3: comSelect.CommandText = "SELECT 名前 電話 メール FROM 個人名簿 WHERE 登録日 > 2008/01/01";
4:
5: SqlDataReader dr = comSelect.ExecuteReader();
6:
7: while( dr.Read() )
8: {
9: //名前
10: string name = dr[ 0 ].ToString()
11:
12: //電話
13: string tel = dr[ 1 ].ToString();
14:
15: //メール
16: string mail = dr[ 2 ].ToString();
17: }

(注意)テスト用のコードなのでこのまま入力しても動きません。


よくありがちなデーターベースから、データーを取得するコードである。

これがLINQを使うとどうなるか、さっそくみてみよう。


**LINQを使用したコード(LINQ to SQL)

1: 個人名簿DataContext dc個人名簿 = new 個人名簿DataContext();
2:
3: var result = from data in 個人名簿 where data.登録日 == DateTime.Now() select data;
4:
5: foreach ( var personal in result )
6: {
7: string name = personal.名前
8:
9: string tel = personal.電話
10:
11: string mail = personal.メール
12: }

(注意)テスト用のコードなのでこのまま入力しても動きません。


一見すると違いはないように見えるかもしれないが、
大きな違いが隠れている。

それぞれの行について解説をいれて行こう。


*行解説
1: 個人名簿DataContext dc個人名簿 = new 個人名簿DataContext();


今回は複数あるLINQプロバイダーのうちの「LINQ to SQL」を使用するので
そのクラスを宣言している。


**「LINQ to SQL」とは

「LINQ to SQL」と聞くとなにやら難しそうな気がするかもしれないが、
使用イメージはデータセットと同じである。

まず新規追加項目から「LINQ to SQL」という項目を見つける
(図1を参照)

そして追加すると「.dbml」と言う拡張子のファイルが追加される
(データセットの場合は「.xsd」ですね)
それをダブルクリックするとデータセットのような画面が表示されるので、
そこにサーバーエクスプローラから対象のテーブルをドラッグ、ドロップする。
(この動作もデータセットと同じですね)

そうすると、まさにデータセットのような画面でできあがる
(図2を参照)

1: 個人名簿DataContext dc個人名簿 = new 個人名簿DataContext();


その後の使い方もにていて、
「作成したファイル名」+DataContext
というクラス名でインスタンスを生成できる

3: var result = from data in dc個人名簿.個人名簿 where data.登録日 == DateTime.Now() select data;


その後いきなりSQL文の生成に入る。
コネクションや、コマンドの生成の必要はない。

var result

とあるが、これは以前説明した自動変数というやつである
「適切な型を自動的に選択してくれる」という便利な型である

注意してほしいのはobjectクラスとも違うし、
javascriptのvarとも違うしVBAのdimとも違う、
適切な型を選んでくれるのである
ためしにブレークポイントで止めると、
適切な型に変換されているのが確認できる。

from data in dc個人名簿.個人名簿

いきなりFROM文からはじまっている
通常「SELECT 〜 FROM」のはずだから面食らうかもしれない、
しかし、よく考えてほしい。

こんなSQLがあったとする
SELECT A.Name B.Status FROM Personal AS A PersonalStatus AS B

FROM文で変数(テーブル名)の宣言があるからこそ、
SELECT文でA.Name(もしくはPersonal.Name)と使えるのである。
突然「A.Name」などとしたら、コンパイラーは戸惑ってしまうだろう。

これと同じ理由である、C#は先に変数を宣言しないと、
その後の文で使用することはできない。

だからこそ、最初にFROMがきてしまうのだ、これで使用するテーブル名を
変数名として使用する事が可能になる

from data in dc個人名簿.個人名簿

**dc個人名簿という「LINQ to SQL」に定義されている「個人名簿」テーブルを「data」と言う変数でこれから使用しますよ。

という宣言文である。

where data.登録日 == DateTime.Now()

ここからがLINQの便利なところである。

なんとC#の変数をそのまま使えてしまうのだ
(一部制限あり、制限がある部分は別コラムにて)

普通のSQLだと
" 登録日 = '" + DateTime.Now.ToString("yyyy/MM/dd") + "'"
というような形で作らなければならないわけだが、
c#の構文のまま使えてしまうのは非常にありがたい。

select data;

最後にSELECT文だが、これは説明の必要がないだろう、
最後に「;」が付いているか、これはSQL文(文字列)ではなく
C#の構文であるわけなので当然である。

5: foreach ( var personal in result )

ここでも「var」(自動変数)を使っている、「var」(自動変数)を使わなければ、
どんな構文になるのか考えてみよう。

7: string name = personal.名前

結果はそのまま取り出すことが可能である。


*「LINQ to SQL」まとめ

「LINQ to SQL」とかいているが、これはもうSQLということを忘れた方がいい。
なぜならば、他のプロバイダーを使用することによって、コレクションにクエリーをかけたり、XMLにクエリーをかけたりと色々な事ができるからだ。

つまりSQL文に似せれば似せるほど汎用性がなくなってしまうためである。

これは新しいC# 3.0の構文だと思って受け入れていくのがいいのでないかと思う。


次回はおなじ「LINQ to SQL」を「ラムダ式」方式で記述する方法を掲載しよう。


QuickRec--メール・電話・FAXをお客様情報と一緒に全部まとめて一元管理
電話を自動録音することによりトラブルを未然に防ぎます
http://www.quickrec.com/

システム開発のご相談、ホームページ作成なら
アースリンクネットワークへ
http://www.eln.ne.jp