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

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

LINQ:データを並べ替える - orderby句[C#]

2014年11月18日

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

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

書籍転載について

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

 

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

ご注意

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

5-3-3 データを並べ替える - orderby句

 取得したデータを並べ替えるには、orderby句を利用します。たとえば以下は、ArticlesテーブルからPublished列について降順、Title列について昇順でソートする例です。

C#
public ActionResult Orderby()
{
  var articles = from a in db.Articles
                 orderby a.Published descending, a.Title
                 select a;
  return View(articles);
}
リスト5-30 Controllers/LinqController.cs

 SQL-SELECT命令のORDER BY句と同じく、「ソートキー+並び順, ...」(カンマ区切り)の形式でソート順を表します。ただし、並び順はascending(昇順)、descending(降順)で表します。デフォルトはascendingなので、昇順の場合は省略しても構いません*23

  • *23 列そのものだけでなく、たとえばa.Title.Lengthとすることでタイトルの文字列長についてソートするようなこともできます。

 orderby句に相当するメソッド構文は、以下のとおりです。

メソッド概要
OrderBy 昇順にソート
OrderByDescending 降順にソート
ThenBy 昇順にソート(第2キー以降)
ThenByDescending 降順にソート(第2キー以降)
表5-8 ソート関連のメソッド

 メソッド構文では、昇順/降順で異なるメソッドを利用する点、第1キーと第2キー以降とでまた、メソッドを使い分ける点に注意してください。既に他のソート条件が設定されている状態で、OrderBy/OrderByDescendingメソッドを連続して呼び出した場合、それ以前の設定されたソート式は無視されますので注意してください。

 以下は、メソッド構文でリスト5-30を書き換えた例です。

C#
public ActionResult Orderby2()
{
  var articles = db.Articles
                   .OrderByDescending(a => a.Published)
                   .ThenBy(a => a.Title);
  return View(articles);
}
リスト5-31 Controllers/LinqController.cs
応用:ソート可能なグリッド表を作成する

 orderby句の応用として、Articlesテーブルをもとに、ソート可能なグリッド表を作成してみます。それぞれのタイトル行をクリックすると、データを昇順にソートし、同じ列を重ねてクリックすると、昇順⇔降順と反転します。デフォルトでは、タイトル列について昇順でソートします。

C#
 1
 2
 3
3
 5
 6
 7
 8
 9
10
11
12
1
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
public ActionResult Sort(string sort)
{
  // ソート列/順序を判別するキー文字列を生成
  ViewBag.Title     = String.IsNullOrEmpty(sort) ? "dTitle" : "";
  ViewBag.Category  = (sort == "Category" ? "dCategory" : "Category");
  ViewBag.Published = (sort == "Published" ? "dPublished" : "Published");
  ViewBag.Viewcount = (sort == "Viewcount" ? "dViewcount" : "Viewcount");

  // デフォルトではソート指定なし
  var articles = from a in db.Articles select a;

  // 渡されたキー文字列に従って、ソート式を決定
  switch (sort)
  {
    case "Category":
      articles = articles.OrderBy(a => a.Category);
      break;

    case "Published":
      articles = articles.OrderBy(a => a.Published);
      break;

    case "Viewcount":
      articles = articles.OrderBy(a => a.Viewcount);
      break;

    case "dTitle":
      articles = articles.OrderByDescending(a => a.Title);
      break;

    case "dCategory":
      articles = articles.OrderByDescending(a => a.Category);
      break;

    case "dPublished":
      articles = articles.OrderByDescending(a => a.Published);
      break;

    case "dViewcount":
      articles = articles.OrderByDescending(a => a.Viewcount);
      break;

    default:
      articles = articles.OrderBy(a => a.Title);
  }

  return View(articles);
}
リスト5-32 Controllers/LinqController.cs
Razor
 1
 2
 3
 4
 5
2
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
@model IEnumerable<MvcModel.Models.Article>
... 中略 ...
<table class="table">
  <tr>
  <th>
  @Html.ActionLink(
    Html.DisplayNameFor(model => model.Name).ToString(),
    "Sort", new { sort = ViewBag.Title })
  </th>
  <th>
  @Html.ActionLink(
    Html.DisplayNameFor(model => model.Category).ToString(),
    "Sort", new { sort = ViewBag.Category })
  </th>
  <th>
  @Html.ActionLink(
    Html.DisplayNameFor(model => model.Published).ToString(),
    "Sort", new { sort = ViewBag.Published })
  </th>
  <th>
  @Html.ActionLink(
    Html.DisplayNameFor(model => model.Viewcount).ToString(),
    "Sort", new { sort = ViewBag.Viewcount })
  </th>
  </tr>
  @foreach (var item in Model) {
    ... 中略 ...
  }
</table>
リスト5-33 Views/Linq/Sort.cshtml
図5-15 タイトル行をクリックすると、その列でソート(ビュー数をクリックした場合)

 順番は前後しますが、1は与えられたキー文字列(引数sort)に沿って、ソート条件をOrderBy/OrderByDescendingメソッドとして追加しています。キー文字列がない場合(default)とは、

  • 最初にページを開いた時
  • Title列を2回続けてクリックした時

を意味します。この場合は、Title列をキーに昇順ソートします。

 そして、このキー文字列を決定するのが23のコードです。ビューの側(2)ではタイトル行のそれぞれで、以下のようなリンクを生成します。

<a href="/Linq/Sort?sort=Viewcount"> ビュー数 </a>

 ActionLinkメソッドの第3引数(sortキーの値)は、3で用意しています。タイトル、カテゴリー、公開日、ページビュー列それぞれのデフォルト値は、空文字列、Category、Published、Viewcount(それぞれの列について昇順)です。ただし、現在のキー文字列と等しい場合には*24、それぞれを反転させて、dTitle、dCategory、dPublished、dViewcount(それぞれの列について降順)としています。これが同じ列を重ねてクリックした場合には、昇順/降順を切り替えるといった意味です。

  • *24 Title列はデフォルトのソートキーなので、空文字列かどうかで判断します。

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

書籍転載: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」)。

書籍転載:ASP.NET MVC 5 実践プログラミング
22. LINQ:重複のないデータを取得する - Distinctメソッド[C#]

クエリ後の結果セットから重複したデータを除去するためのDistinctメソッドについて解説する。書籍転載の22本目(基礎編「5-3-5」)。

サイトからのお知らせ

Twitterでつぶやこう!