Deep Insider の Tutor コーナー
>>  Deep Insider は本サイトからスピンオフした姉妹サイトです。よろしく! 
書籍転載:ASP.NET MVC 5 実践プログラミング

書籍転載:ASP.NET MVC 5 実践プログラミング

LINQ:データの検索条件を指定する - where句[C#]

2014年11月18日

クエリ後の結果セットをフィルターするためのwhere句/Whereメソッドについて解説する。書籍転載の19本目(基礎編「5-3-2」)。

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

書籍転載について

 本コーナーは、秀和システム発行の書籍『ASP.NET MVC 5 実践プログラミング』の中から、特にBuild Insiderの読者に有用だと考えられる項目を編集部が選び、同社の許可を得て転載したものです。

 

 『ASP.NET MVC 5 実践プログラミング』の詳細や購入は秀和システムのサイト目次ページをご覧ください。

ご注意

 本記事は、書籍の内容を改変することなく、そのまま転載したものです。このため用字用語の統一ルールなどはBuild Insiderのそれとは一致しません。あらかじめご了承ください。

5-3-2 データの検索条件を指定する - where句

 結果セットをフィルターするためのwhere句(Whereメソッド)については、前項でも触れましたので、ここではより具体的なサンプルを作成してみます。指定された検索条件(タイトルと分類)Articlesテーブルのデータを絞り込むためので例です。条件が指定されない場合には、全てのデータを出力します。

C#
 1
 2
 3
 4
 5
 6
 7
1
 9
2
11
12
13
14
15
16
17
18
19
public ActionResult Search(string keyword, bool? released)
{
  // デフォルトではすべてのデータを取得
  var articles = from a in db.Articles
                 select a;

  //[キーワード]欄が空でない場合、その値で部分一致検索
  if (!string.IsNullOrEmpty(keyword))
  {
    articles = articles.Where(a => a.Title.Contains(keyword));
  }

  //[公開済]チェックが付いている場合、公開済みの記事だけを絞り込み
  if (released.HasValue && released.Value)
  {
    articles = articles.Where(a => a.Released);
  }
  return View(articles);
}
リスト5-27 Controllers/LinqController.cs
Razor
3
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
@model IEnumerable<MvcModel.Models.Article>

@{
  ViewBag.Title = "Search";
}

<h2>Search</h2>

@using (Html.BeginForm("Search", "Linq", FormMethod.Get,
        new { @class = "form-inline" }))
{
  @Html.Label("keyword", " キーワード:", new { @class = "control-label" })
  @Html.TextBox("keyword", null, new { @class = "form-control" })
  @Html.Label("released", " 公開済:", new { @class = "control-label" })
  @Html.CheckBox("released")
  <input type="submit" value=" 検索 " class="btn btn-info" />
}

<hr />

<table class="table">
<tr>
  <th>@Html.DisplayNameFor(model => model.Title)</th>
  <th>@Html.DisplayNameFor(model => model.Category)</th>
  <th>@Html.DisplayNameFor(model => model.Published)</th>
</tr>
<!-- 検索結果をテーブルに整形 -->
@foreach (var item in Model) {
  <tr>
    <td>@Html.DisplayFor(modelItem => item.Title)</td>
    <td>@Html.DisplayFor(modelItem => item.Category)</td>
    <td>@Html.DisplayFor(modelItem => item.Published)</td>
  </tr>
}
</table>
リスト5-28 Views/Linq/Search.cshtml
図5-14 指定された条件に基づいてグリッド表を検索

 1では、[キーワード]欄でなんらかの値が入力されたか(IsNullOrEmptyメソッドがtrue)、[公開済]欄がチェックされた場合に、Whereメソッドで条件句を追加しています。Whereメソッドを続けて呼び出した場合、双方は論理積(AND)で連結されます。

 SQLのLIKE演算子に相当する部分一致検索を実装するならば、2のようにContainsメソッドを利用してください。「含んでいない」を表すならば、!a.Title.Contains(keyword)のように、否定演算子(!)を利用します。その他、StartsWith/EndsWithメソッドを利用することで、前方一致検索/後方一致検索も表現できます。

C#
// keyword ではじまる Title 列に合致
articles = articles.Where(a => a.Title.StartsWith(keyword));

 3でBeginFormメソッドに「FormMethod.Get」(HTTP GET)を指定しているのは、検索結果をブックマークできるようにするためです。HTTP GETでは、入力値はクエリー情報としてURLに付与されますので、入力結果を復元する場合に便利です。

【Note】唯一の要素を取得する

 Whereメソッドの特殊系として、Singleメソッドもあります*21。Singleメソッドでは、指定された条件式で単一のデータを取得します。取得したデータが複数件ある、もしくは空である場合には、SingleメソッドはInvalidOperationException例外を発生しますので、注意してください*22。その性質上、Singleメソッドは最初から結果を1件に絞り込めるようなケースで利用すべきです。

  • *21 対応するクエリー式構文はありません。
  • *22 結果が空の場合に、型に応じたデフォルト値(参照型ではnull)を返したい場合には、代わりにSingleOrDefaultメソッドを利用してください。
C#
var article = db.Articles.Single(
  a => a.Url == "http://codezine.jp/article/corner/518");
return Content(article.Title);
  // 結果:Bootstrap でレスポンシブでリッチなサイトを構築
リスト5-29 Controllers/LinqController.cs

※以下では、本稿の前後を合わせて5回分(第17回~第21回)のみ表示しています。
 連載の全タイトルを参照するには、[この記事の連載 INDEX]を参照してください。

書籍転載:ASP.NET MVC 5 実践プログラミング
17. モデル単位にテンプレートを決定する - DisplayForModel/EditorForModelメソッド[Razor]

プロパティ単位ではなくモデル単位でHTMLコードを出力するDisplayForModel/EditorForModelメソッドについて解説。また、そのテンプレートを自作する方法を説明する。書籍転載の17本目(基礎編「4-4-4」)。

書籍転載:ASP.NET MVC 5 実践プログラミング
18. LINQとは?[C#]

LINQ to Entitiesの説明に入る前に、まずはC#の言語機能として組み込まれたクエリ機能「LINQ」について簡単に紹介する。書籍転載の18本目(基礎編「5-3-1」)。

書籍転載:ASP.NET MVC 5 実践プログラミング
19. 【現在、表示中】≫ LINQ:データの検索条件を指定する - where句[C#]

クエリ後の結果セットをフィルターするためのwhere句/Whereメソッドについて解説する。書籍転載の19本目(基礎編「5-3-2」)。

書籍転載:ASP.NET MVC 5 実践プログラミング
20. LINQ:データを並べ替える - orderby句[C#]

取得したデータを並べ替えるためのorderby句/OrderByメソッドについて解説する。書籍転載の20本目(基礎編「5-3-3」)。

書籍転載:ASP.NET MVC 5 実践プログラミング
21. LINQ:取得列を明示的に指定する - select句/SelectManyメソッド[C#]

範囲変数(エンティティ)から特定のプロパティだけを取り出したり、プロパティ値を加工したりするためのselect句/Selectメソッドについて解説。書籍転載の21本目(基礎編「5-3-4」)。

サイトからのお知らせ

Twitterでつぶやこう!