はじめに
本連載では、データベース連携全体を扱うには紙面が足りませんので、主にデータベースからのクエリ処理(SQLのSELECT文に相当)について解説します。また、ユーザーインタフェースについては今回考慮せず、コマンドラインアプリケーションとして作成します。データベースアクセスについての基本を抑えておけば、ASP.NETやASP.NET MVC、Windowsデスクトップアプリなど、様々な分野に応用できます。
第1、2回を通して、本連載に必要な基礎知識を解説します。第1回ではLINQおよびラムダ式の概要について解説し、第2回で実際のクエリ処理を解説します。
第3回では、LINQが実際にどのようなSQLに変換されるのかを解説します。単純にクエリが書けたとしても、実処理において「N+1問題」などのパフォーマンス的な問題が起きることは少なくありません。SQLを確認しつつ、対処方法について解説します。
第4回では、LINQではどの程度の機能を使用できるのか、SQLとの対応関係について解説します。実際のクエリを書いていく中で、どの機能は使えるのかを理解していきましょう。
冒頭に挙げたような、「食わず嫌いだけどLINQはちょっと……」「ADO.NETなどを使ってデータベースアクセスは書いてきたけど、LINQって何なの? 美味しいの?」といった方には、本連載を是非オススメします。また、他の言語やWebアプリケーションフレームワークの開発経験がある方にも是非LINQに触れていただくきっかけになれば幸いです。
なお、本連載ではデータベースアクセスにEntity Framework Code Firstというフレームワークを使用します。幾らかの解説は記事中に含めていますが、詳細については、CodeZineの過去記事「Entity Frameworkコードファーストで開発してみよう」などを参照してください。
対象読者
- C#についての基本的な知識を持っていること
- SQLやデータベースの基本的な知識を持っていること
- LINQ未経験者、初学者
必要な環境
本連載では以下の環境でサンプルを実行します。
- Windows 7(8、8.1も対応)
- Visual Studio 2013 Update 3
LINQとは~クエリ式とメソッド式~
まず、「LINQとはなんぞや」という問いから考えましょう。冒頭に上げた統合言語クエリ(Language INtegrated Query)という名の通り、LINQはプログラミング言語(C#やVB)に統合されたクエリ用言語です。通常データベースアクセスに使用するSQLが、C#やVBのプログラム内では文字列として扱われるのに対し、LINQはそれ自体が言語に統合されたクエリとして認識されます。また、SQLの対象は基本的にリレーショナルデータベースに限られますが、LINQの対象は、配列・コレクション・データベース・XMLなど多岐にわたります。
1つLINQのサンプルを見てみましょう。リスト1は、文字列配列から文字列長6のものを検索してソートし、大文字に変換する、というクエリ処理をLINQで書いたものです。
//クエリ対象文字列配列 string[] names = { "Doi", "Tanaka", "Nakamura", "Saitou", "Yamada" }; //配列から、文字列長が6の文字列を検索し、辞書順にソートし、大文字に変換するLINQ IEnumerable<string> query = from s in names where s.Length == 6 orderby s select s.ToUpper(); //カンマを挟んで結果を出力 Console.WriteLine(string.Join(",", query)); //出力結果: SAITOU,TANAKA,YAMADA
「処理内容は分かるけど、わざわざ新しい構文まで覚える必要があるのかな……」というのが率直な感想でしょうか。それでは、以下はどうでしょうか。
//上記クエリ式をメソッド式に置き換えたもの query = names.Where(x => x.Length == 6).OrderBy(x => x).Select(x => x.ToUpper()); //出力結果は同じ Console.WriteLine(string.Join(",", query));
これは、リスト1のLINQと同じ処理になります。「x => ...」という書き方が見慣れないかもしれませんが、Where(条件絞込)、OrderBy(並び替え)、Select(選択)というメソッドを連続して呼び出しているだけですので、比較的処理内容が掴みやすいのではないでしょうか。リスト1のLINQの書き方をクエリ式、リスト2のLINQの書き方をメソッド式と呼びます。LINQというとクエリ式の方がイメージされますが、クエリ式で書ける内容はメソッド式でも書くことができますので、無理にクエリ式を覚えなくとも、メソッド式を使えば大丈夫です[*]。クエリ式のように「最初にfrom~inを書いて、次にwhereで、次はorderbyかな?」と構文自体に悩む必要がないので、メソッド式の方が習得は早いかもしれません。
まずは「クエリ式だけがLINQじゃない。メソッド式なら割と簡単かも」と覚えてください。本連載ではここでクエリ式は封印し、後はメソッド式のみで解説していきます。
[*]実際には、クエリ式よりもメソッド式の方が対応する機能が多く、メソッド式でしか書けない処理も存在します。