- 上原 正吉
- 株式会社アースリンクネットワーク
- Webプロデューサー
対象:システム開発・導入
- 清水 圭一
- (IT経営コンサルタント)
- 清水 圭一
- (IT経営コンサルタント)
LINQ解説 2「LINQ to SQL」- C# 3.0 (dotnet 3.5)
-
C# .Net 開発
LINQ解説
2008-10-02 13:40
*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