LINQを用いたDBデータ取得方法をSQLと比較して解説!

IT関連
kai
kai

サイト管理人の’kai’です。

kai君、今日は何をするの?

ポチ
ポチ
kai
kai

今日は、IT技術のLINQについて教えるよ!
これは、僕が数年前にVB.NETを用いた開発で苦しんだ時のメモを基に書いているから少し古い内容もあるかもしれないから参考程度にしてね。


kai
kai

それでは、先ずはLINQについて説明しよう!

LINQとは

LINQとは、統合言語クエリ (Language INtegrated Query)の略語となります。

LINQは、「.NET framework」で様々な種類のデータ集合に対して標準化された方法でデータを問い合わせることを可能にするために、プログラミング言語に統合された機能のことを言います。

kai
kai

難しく書いてありますが、
要は「.NET」系のプログラミング言語(※ここでは、vb.net言語とする。)で様々なデータの集まりに対して、共通的に対応することが出来るようになったということです。
今回は、このデータの集まりをDBデータとして考えていきます。


kai
kai

それでは、実際に見ていきましょう!

SQLとLINQの比較

一般的な取得処理

  • SQL
SELECT * FROM table AS name WHERE flag='1' ORDER BY no
  • LINQ
From name In table Where flag='1' Order By no Select name

「内部結合」を用いた取得処理

  • SQL
SELECT * FROM table AS name INNER JOIN table2 AS name2 ON name.value = name2.value
  • LINQ
From name In table Join name2 In table2 On name.value Equals name2.value Select name, name2

【補足】On句の条件には、テーブル項目しか使用することが出来ないため、”table.value = 1″といった条件は用いることが出来ない。このため、このような条件を用いたい場合は、下記の「副問い合わせ」のように条件で絞り込んだテーブルを作成し、参照する必要がある。

「外部結合」を用いた取得処理

  • SQL
SELECT * FROM table AS name LEFT OUTER JOIN table2 AS name2 ON name.value = name2.value
  • LINQ
From name In table Group Join name2 In table2 On name.value Equals name2.value Into sub = Group From name2 Into sub.DefaultIfEmpty Select name, name2

【補足】上記の方法以外に、以下のようにして取得出来る。この方法を用いると、「内部結合」の補足説明にあった”table.value = 1″といった条件を使用することが出来る。

From name2 In table2.Where(Function(x) x.value = name.value).DefaultIfEmpty()

「副問い合わせ」を用いた取得処理

  • SQL
SELECT * FROM (SELECT * FROM table AS name) AS name2 WHERE flag='1'
  • LINQ

LINQで実施する場合は、2処理必要となります。

副問い合わせのデータを取得した後、その取得結果を用いて取得する必要があります。

Dim tmp = ( From name In table Select * )
From name2 In tmp Where flag='1' Select name2

「グループ化」を用いた取得処理

  • SQL
SELECT ID , Max(Number) FROM table AS name GROUP BY id
  • LINQ
From name In table Group By name.id Into Group Select id , Group.Select(Function(m) m.Number).Max

「IN句」を用いた取得処理

  • SQL
SELECT * FROM table AS name WHERE value IN (1, 2)
  • LINQ
From name In table Where list.Contains(Value) Select name

【補足】listとは、事前に対象条件を定義した配列となります。(上記の場合、Dim list As Integer() = {1, 2})


kai
kai

LINQは特殊な記載方法もありますが、基本的には以下のような順番で記載されています。
 1. 対象のテーブルを決める。(From ~)
 2. 条件を絞り込む。(Where ~)
 3. 取得項目を決める。(Select ~)
ただし、プログラミング言語での処理となったので、気を付ける点があります。
その内容を見ていきましょう。

注意事項

以下の点に注意して対応すること。

  • Null判定に注意する。EntityFrameworkではVBコードで判定するため、Nothing判定となる。このため、Nothingの既定値(Integer:0、String:Null等)の判定となってしまうため、IntegerでのNull判定は出来ないこととなる。対処法はテーブル自体のNothing判定にする等の方法をとる必要がある。

まとめ

kai
kai

LINQを用いたDBデータの取得方法について説明しました。
分かってくれたかな?

何となくだけど、分かったよ!
でも、実際に試してみないと理解出来ない部分が多いかな?

ポチ
ポチ
kai
kai

そうだね!
実際に、動かして試してみることで納得出来る部分が大きいと思うよ。
上記の内容を参考に、色々と試してみてください。