Entity FrameworkとLINQで快適DBプログラミング

CodeZine / 2014年12月26日 14時0分

図6 Employeesテーブルの実際の値。営業部所属なのでDepartment_Idが1となる

 .NET Framework 3.5から導入されたLINQ(Language INtegrated Query:統合言語クエリ)、活用していますか? ぱっと見の構文の目新しさに気を取られ、「また何か新しい文法を覚えなくてはいけないのか……」と敬遠しがちかもしれません。また、「シンプルな構文でクエリが書けるのは便利そうだけど、別にこれまでの方法で書いても問題無いのでは?」「なんだかパズルっぽい使い方ばかりで、実業務にどう活用できるのかイメージが湧かない」という意見もあるでしょう。LINQの持つポテンシャルは大変高く、特にデータベースとの連携においては非常に強力な仕方でコーディングをサポートしてくれます。本連載では、データベースプログラミングにおいてLINQをどのように活用できるのか、解説していきます。

■はじめに

 本連載では、データベース連携全体を扱うには紙面が足りませんので、主にデータベースからのクエリ処理(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で書いたものです。

リスト1 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
 「処理内容は分かるけど、わざわざ新しい構文まで覚える必要があるのかな……」というのが率直な感想でしょうか。それでは、以下はどうでしょうか。

リスト2 LINQのサンプル(メソッド式)
//上記クエリ式をメソッド式に置き換えたもの 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じゃない。メソッド式なら割と簡単かも」と覚えてください。本連載ではここでクエリ式は封印し、後はメソッド式のみで解説していきます。

[*]実際には、クエリ式よりもメソッド式の方が対応する機能が多く、メソッド式でしか書けない処理も存在します。



CodeZine

トピックスRSS

ランキング