Shoeisha Technology Media

CodeZine(コードジン)

特集ページ一覧

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

Visual StudioでDB連携も簡単プログラミング ~知っておきたいLINQメソッド式&ラムダ式 第1回

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2014/12/26 14:00

 .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じゃない。メソッド式なら割と簡単かも」と覚えてください。本連載ではここでクエリ式は封印し、後はメソッド式のみで解説していきます。

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


  • LINEで送る
  • このエントリーをはてなブックマークに追加

修正履歴

  • 2015/01/05 17:38 タイトル周りを修正しました。

著者プロフィール

  • WINGSプロジェクト 土井 毅(ドイ ツヨシ)

    <WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂...

  • 山田 祥寛(ヤマダ ヨシヒロ)

    静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for ASP/ASP.NET。執筆コミュニティ「WINGSプロジェクト」代表。 主な著書に「入門シリーズ(サーバサイドAjax/XMLD...

バックナンバー

連載:Visual StudioでDB連携も簡単プログラミング ~知っておきたいLINQメソッド式&ラムダ式
All contents copyright © 2005-2018 Shoeisha Co., Ltd. All rights reserved. ver.1.5