.net column
.NET開発者のためのブログメディア

ORDER BY句のポイント6つと使い方|Then Byについても解説

 
SE
LINQ機能ってなんだか難しそうですが、やっぱり使わないとダメなのでしょうか?
PM
LINQ機能は初心者の方にとっては難しく感じるかもしれませんね。でも慣れてくると使い勝手がいい機能になりますよ。簡単にデータに問い合わせできるので、プログラム全体の質も上がってきます。

LINQ機能におけるORDER BY句を利用してのデータの並び替えとは


データベースに問い合わせを行ったことがある方なら、ORDER BY句で連想されるのはデータの並び替えではないでしょうか。LINQ機能でもORDER BY句を利用するとデータを並び替えることができます。

LINQではメソッド構文(ラムダ式を使用)とクエリ構文といった二通りの構文の書き方があります。

以下、クエリ構文を利用したLINQの基本形です。ORDER BY句は、Where句とSelect句の間にコーディングします。

以下、メソッド構文でLINQ機能を利用した時に、ORDER BY句と同様にデータを並び替えることが可能なメソッドです。

OrderBy句 昇順ソートを行います。
OrderByDescending句 降順ソートを行います。
ThenBy句 昇順ソートを行います。ソート条件を複数つけたい場合などで利用します。
ThenByDescending句 降順ソートを行います。ソート条件を複数つけたい場合などで利用します。

ORDER BYのポイント6つ

ここからは、C#のLINQ機能でORDER BY句を利用する際のポイントを6つほど紹介していきます。

MySQLやOracle SQLなど、SQLを使用してデータベースにアクセスしたことがあれば見覚えのあるものばかりでしょう。

ただし、SQLとは違いますのでご注意ください。このページを最後まで読んで、よく意味を理解してください。

1:基本構文

まずは基本となる構文を見ていきましょう。

基本的な構文は次の通りです。

わかりやすいように例を用いて説明していきましょう。

ここではpricesという配列を、クエリ構文を使用してそのまま表示させています。

これだけだとLINQを使うメリットがわからないと思いますので、次からORDER BY句やWhere句を使用して、並べ替えや抽出条件を追加していきます。

2:ASCを使った昇順の指定方法

先ほどの基本構文にORDER BY句を追加してみましょう。「orderby ~ ascending」で昇順に並べ替えることができます。

ORDER BY句はデフォルトで昇順になれべ替えるため、「ascending」は省略しても問題ありません。「orderby」の後ろに記載した値で順番を指定できます。

3:DESCを使った降順の指定方法

逆に降順で並び替えたい場合は、orderbyの後ろに「descending」を追加することで逆順になります。

さっそく使ってみましょう。

4:複数の要素をカンマ区切りでソートする場合

今度は複数の要素を使ってソートをしていきます。
例えば、硬貨の枚数と金額でソートした場合を考えてみましょう。

次のコードは硬貨の枚数が少ない順で、枚数が同じだった場合は硬貨の金額が高い順で並べ替えています。

5:WHERE句を付けて条件を指定する方法

WHERE句を使って特定の条件を指定してみましょう。

次の例は、priceが100未満を条件にしています。

今回は数値に対しての条件でしたが文字列を指定してあげることも可能です。また、複数条件で抽出することも可能です。

6:GROUP BYを付けてグループ化を行う方法

続いてはGROUP BY句の説明になります。

Group by句は今まではと少し毛色が異なるため分かりづらいでしょう。
やっていることはシンプルなのですぐに理解できるでしょう。

LINQ機能におけるORDER BY句の使用方法

ここでは、LINQ機能でのORDER BY句の活用例をメソッド構文とクエリ構文に分けて紹介していきます。

メソッド構文で書くLINQでの活用例

クエリ構文で書くLINQでの活用例

ORDER BY句以外で並び替えできるもの

ここからはThen By句の使用方法を説明していきます。

Then by 句はORDER BY句で並び替えた結果に対してさらに並び替えを行いたい場合に使用します。Then by句単体での使用はできませんので、ご注意ください。

Then By句

これまで通り、例を挙げていきます。

Then By句はORDER BY句の後ろにつけてあげましょう。Then By句で指定することでORDER BY句で同値だったものについてもソートの条件を指定することが可能です。

ORDER BY句を使用して、複数要素での並び替えを行った際のコードを書き換えてみましょう。

硬貨の枚数で昇順にソートした結果に対して、硬貨の金額で昇順にソートします。

Then By Descending句

先ほどはThen By句を使用して昇順に並び替えるやり方を見たので、今度は反対にThen By Descending句の使い方を見ていきましょう。

先ほどと同様にORDER BY句の後ろにThen By Descending句をつけましょう。

Then By Descending句を使用することで、昇順と降順の並び替えを組み合わせることが可能になります。

DISTINCTとORDER BYを併用するときの注意点

DISTINCT句は重複したデータを省略するのにとても便利ですが、OORDER BY句と併用する際には2点ほど注意が必要です。ここでは注意点を説明していこうと思います。

1:DISTINCTとORDER BYの使用順序

DISTINCTとORDER BYを併用する際、記載する順番を誤ると想定通りの結果が得られなくなるため注意が必要です。

例えば次の例を見てみましょう。

ORDER BYで降順に並び替えた結果に対して、DISTINCTで重複した複数の値をなくし結果を表示していますが、ORDER BY句が効かないため出力結果は降順になっていません。

最終的に降順に並び替えた結果が欲しい場合はDistinctの後にOrder By句を使用する必要があります。

DISTINCT使用時にSELECTに含まれない項目の並べ替え

また、DISTINCTとORDER BYを併用する際は、DINSTINCT句をSELECT文に指定する場合、ORDER BYではSELECTのリストに含まれていない項目を並び替えに使用できないため注意しましょう。

SE
OrderBy句やWhere句などSQLを利用したことがある方なら見覚えのある単語がけっこうLINQ機能には出てきますが、LINQとSQLは同じなのでしょうか?
PM
LINQとSQLは全くの別物ですよ。 C#独自の構文ですのでSQLとは混在しないようにしましょうね!

ORDER BY句を活用して並び順を保障しよう

こまでC#のLINQでORDER BY句について説明してきました。

最初に挙げた基本形を見直してみましょう。

いかがでしょうか。最初に読んだときはよく分からなかった構文も理解できるようになっているのではないでしょうか。ORDER BY句を使用しない場合、必ずしも表示順が一致するとは限りません。

思わぬバグを引き起こさないためにも、ORDER BY句を使用して並び順を保証してあげましょう。


.NET分野でのキャリアアップをお考えの方は、現在募集中の求人情報をご覧ください。

また、直接のエントリーも受け付けております。

エントリー(応募フォーム)

Search

Popular

reccomended

Categories

Tags