Entity FrameworkとLINQで快適DBプログラミング
Visual StudioでDB連携も簡単プログラミング ~知っておきたいLINQメソッド式&ラムダ式 第1回
ダウンロード サンプルファイル (9.8 MB)
.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で書いたものです。
//クエリ対象文字列配列
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じゃない。メソッド式なら割と簡単かも」と覚えてください。本連載ではここでクエリ式は封印し、後はメソッド式のみで解説していきます。
[*]実際には、クエリ式よりもメソッド式の方が対応する機能が多く、メソッド式でしか書けない処理も存在します。
- 修正履歴
-
- 2015/01/05 17:38 タイトル周りを修正しました。
この記事は参考になりましたか?
- Visual StudioでDB連携も簡単プログラミング ~知っておきたいLINQメソッド式&ラムダ式連載記事一覧
- この記事の著者
-
山田 祥寛(ヤマダ ヨシヒロ)
静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数。
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
-
WINGSプロジェクト 土井 毅(ドイ ツヨシ)
<WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書、記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
この記事は参考になりましたか?
この記事をシェア
