書籍転載:ASP.NET MVC 5 実践プログラミング
LINQ:データの検索条件を指定する - where句[C#]
クエリ後の結果セットをフィルターするための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テーブルのデータを絞り込むためので例です。条件が指定されない場合には、全てのデータを出力します。
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);
}
|
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>
|
1では、[キーワード]欄でなんらかの値が入力されたか(IsNullOrEmptyメソッドがtrue)、[公開済]欄がチェックされた場合に、Whereメソッドで条件句を追加しています。Whereメソッドを続けて呼び出した場合、双方は論理積(AND)で連結されます。
SQLのLIKE演算子に相当する部分一致検索を実装するならば、2のようにContainsメソッドを利用してください。「含んでいない」を表すならば、!a.Title.Contains(keyword)
のように、否定演算子(!
)を利用します。その他、StartsWith/EndsWithメソッドを利用することで、前方一致検索/後方一致検索も表現できます。
// 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メソッドを利用してください。
var article = db.Articles.Single(
a => a.Url == "http://codezine.jp/article/corner/518");
return Content(article.Title);
// 結果:Bootstrap でレスポンシブでリッチなサイトを構築
|
※以下では、本稿の前後を合わせて5回分(第17回~第21回)のみ表示しています。
連載の全タイトルを参照するには、[この記事の連載 INDEX]を参照してください。
17. モデル単位にテンプレートを決定する - DisplayForModel/EditorForModelメソッド[Razor]
プロパティ単位ではなくモデル単位でHTMLコードを出力するDisplayForModel/EditorForModelメソッドについて解説。また、そのテンプレートを自作する方法を説明する。書籍転載の17本目(基礎編「4-4-4」)。
18. LINQとは?[C#]
LINQ to Entitiesの説明に入る前に、まずはC#の言語機能として組み込まれたクエリ機能「LINQ」について簡単に紹介する。書籍転載の18本目(基礎編「5-3-1」)。
19. 【現在、表示中】≫ LINQ:データの検索条件を指定する - where句[C#]
クエリ後の結果セットをフィルターするためのwhere句/Whereメソッドについて解説する。書籍転載の19本目(基礎編「5-3-2」)。
20. LINQ:データを並べ替える - orderby句[C#]
取得したデータを並べ替えるためのorderby句/OrderByメソッドについて解説する。書籍転載の20本目(基礎編「5-3-3」)。
21. LINQ:取得列を明示的に指定する - select句/SelectManyメソッド[C#]
範囲変数(エンティティ)から特定のプロパティだけを取り出したり、プロパティ値を加工したりするためのselect句/Selectメソッドについて解説。書籍転載の21本目(基礎編「5-3-4」)。