カテゴリ: C# 更新日: 2026/02/07

C#のクエリ式とメソッド式の書き換え方を完全ガイド!LINQの2つの書き方をマスター

C#のクエリ式とメソッド式の書き換え方を学ぼう
C#のクエリ式とメソッド式の書き換え方を学ぼう

先生と生徒の会話形式で理解しよう

生徒

「LINQのクエリ式とメソッド式って、どちらを使えばいいんですか?」

先生

「どちらも同じ結果が得られますが、書き方が違うんです。両方を理解すると、コードの読み書きがぐっと楽になりますよ。」

生徒

「具体的にはどう違うんですか?」

先生

「それでは、クエリ式とメソッド式の書き換え方を見ていきましょう!」

1. クエリ式とメソッド式とは?

1. クエリ式とメソッド式とは?
1. クエリ式とメソッド式とは?

C#のLINQ(Language Integrated Query:リンク)には、データを検索したり加工したりするためのクエリ式メソッド式という2つの書き方があります。これはまるで、同じ目的地に行くのに電車で行くか車で行くかを選ぶようなものです。どちらを使っても同じ結果が得られますが、書き方や見た目が異なります。

クエリ式は、SQLというデータベースを扱う言語に似た書き方で、fromwhereselectといったキーワードを使います。見た目がわかりやすく、データベースの経験がある人には馴染みやすい書き方です。

一方、メソッド式は、Where()Select()といったメソッド(機能)を使って処理を繋げていく書き方です。メソッドとは、特定の処理をまとめたものです。短く書けることが多く、複雑な処理をするときに便利です。

2. 基本的な書き換え方

2. 基本的な書き換え方
2. 基本的な書き換え方

まずは、最もシンプルな例から見ていきましょう。数値のリストから特定の条件に合うものを取り出す処理です。

クエリ式での書き方


int[] numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

var result = from n in numbers
             where n > 5
             select n;

foreach (var num in result)
{
    Console.WriteLine(num);
}

メソッド式での書き方


int[] numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

var result = numbers.Where(n => n > 5);

foreach (var num in result)
{
    Console.WriteLine(num);
}

どちらも「5より大きい数値を取り出す」という同じ処理です。実行すると、以下のような結果が得られます。


6
7
8
9
10

クエリ式ではfromでデータ元を指定し、whereで条件を指定し、selectで何を取り出すかを指定します。メソッド式ではWhere()メソッドの中に条件を書きます。n => n > 5ラムダ式と呼ばれ、「nという値が5より大きいかどうか」を判定する短い関数です。

3. 複数の条件を指定する書き換え

3. 複数の条件を指定する書き換え
3. 複数の条件を指定する書き換え

次は、複数の条件を組み合わせた例を見てみましょう。例えば、「5より大きく、かつ8より小さい数値」を取り出す場合です。

クエリ式


int[] numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

var result = from n in numbers
             where n > 5 && n < 8
             select n;

foreach (var num in result)
{
    Console.WriteLine(num);
}

メソッド式


int[] numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

var result = numbers.Where(n => n > 5 && n < 8);

foreach (var num in result)
{
    Console.WriteLine(num);
}

6
7

&&は「かつ」を意味する論理演算子で、両方の条件が真(正しい)の場合にだけ結果が真になります。クエリ式でもメソッド式でも、同じように&&を使って複数の条件を組み合わせることができます。

4. データの並び替えを行う書き換え

4. データの並び替えを行う書き換え
4. データの並び替えを行う書き換え

データを昇順(小さい順)や降順(大きい順)に並び替える処理も、よく使われます。

クエリ式(降順に並び替え)


int[] numbers = { 3, 7, 1, 9, 2, 8, 5 };

var result = from n in numbers
             orderby n descending
             select n;

foreach (var num in result)
{
    Console.WriteLine(num);
}

メソッド式(降順に並び替え)


int[] numbers = { 3, 7, 1, 9, 2, 8, 5 };

var result = numbers.OrderByDescending(n => n);

foreach (var num in result)
{
    Console.WriteLine(num);
}

9
8
7
5
3
2
1

クエリ式ではorderbyキーワードを使い、降順にする場合はdescendingを付けます。昇順の場合はascendingを付けるか、何も付けません。メソッド式では、降順ならOrderByDescending()、昇順ならOrderBy()メソッドを使います。

5. データを加工して取り出す書き換え

5. データを加工して取り出す書き換え
5. データを加工して取り出す書き換え

取り出したデータをそのまま使うのではなく、加工してから取り出すこともできます。例えば、数値を2倍にして取り出す場合を見てみましょう。

クエリ式


int[] numbers = { 1, 2, 3, 4, 5 };

var result = from n in numbers
             select n * 2;

foreach (var num in result)
{
    Console.WriteLine(num);
}

メソッド式


int[] numbers = { 1, 2, 3, 4, 5 };

var result = numbers.Select(n => n * 2);

foreach (var num in result)
{
    Console.WriteLine(num);
}

2
4
6
8
10

クエリ式ではselectの後に加工処理を書きます。メソッド式ではSelect()メソッドを使い、ラムダ式の中で加工処理を記述します。このように、selectSelect()は単にデータを取り出すだけでなく、データを変換する役割も持っています。

6. 複数の処理を組み合わせた書き換え

6. 複数の処理を組み合わせた書き換え
6. 複数の処理を組み合わせた書き換え

実際のプログラムでは、フィルタリング(条件での絞り込み)、並び替え、データ加工を組み合わせることがよくあります。

クエリ式


int[] numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

var result = from n in numbers
             where n % 2 == 0
             orderby n descending
             select n * 10;

foreach (var num in result)
{
    Console.WriteLine(num);
}

メソッド式


int[] numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

var result = numbers.Where(n => n % 2 == 0)
                    .OrderByDescending(n => n)
                    .Select(n => n * 10);

foreach (var num in result)
{
    Console.WriteLine(num);
}

100
80
60
40
20

この例では、「偶数だけを取り出し、降順に並び替え、10倍にする」という3つの処理を組み合わせています。n % 2 == 0は、nを2で割った余りが0かどうか、つまり偶数かどうかを判定する条件です。

メソッド式では、処理をメソッドチェーンという形で繋げています。メソッドチェーンとは、ドット(.)で複数のメソッドを繋げて、順番に処理を実行する書き方です。上から順に処理が実行されるので、処理の流れが読みやすくなります。

7. 文字列リストでの書き換え例

7. 文字列リストでの書き換え例
7. 文字列リストでの書き換え例

数値だけでなく、文字列のリストに対してもクエリ式とメソッド式を使うことができます。

クエリ式


string[] fruits = { "apple", "banana", "cherry", "date", "elderberry" };

var result = from f in fruits
             where f.Length > 5
             orderby f
             select f.ToUpper();

foreach (var fruit in result)
{
    Console.WriteLine(fruit);
}

メソッド式


string[] fruits = { "apple", "banana", "cherry", "date", "elderberry" };

var result = fruits.Where(f => f.Length > 5)
                   .OrderBy(f => f)
                   .Select(f => f.ToUpper());

foreach (var fruit in result)
{
    Console.WriteLine(fruit);
}

BANANA
CHERRY
ELDERBERRY

この例では、「文字数が5文字より多いフルーツ名を取り出し、アルファベット順に並び替え、大文字に変換する」という処理をしています。Lengthは文字列の長さを取得するプロパティで、ToUpper()は文字列を大文字に変換するメソッドです。

8. どちらを使うべき?

8. どちらを使うべき?
8. どちらを使うべき?

クエリ式とメソッド式、どちらを使うべきか迷うかもしれません。実は、これには明確な正解はなく、状況や好みによって選ぶことができます。

クエリ式が向いている場合

  • SQLに慣れている人が読み書きする場合
  • 複雑な条件のグループ化やジョイン(結合)を行う場合
  • コードの可読性を重視したい場合

メソッド式が向いている場合

  • 短く簡潔に書きたい場合
  • クエリ式では表現できない特殊なメソッドを使う場合
  • 既存のメソッドチェーンに追加したい場合

多くのプログラマーは、シンプルな処理ではメソッド式を使い、複雑な処理ではクエリ式を使う傾向があります。両方の書き方を理解しておけば、他の人が書いたコードを読むときにも困りません。また、必要に応じて使い分けることで、より読みやすく効率的なコードが書けるようになります。

9. 実践的な練習問題

9. 実践的な練習問題
9. 実践的な練習問題

理解を深めるために、クエリ式とメソッド式の両方で同じ結果を得る練習をしてみましょう。以下のような商品リストがあるとします。


var products = new[]
{
    new { Name = "ノートパソコン", Price = 80000 },
    new { Name = "マウス", Price = 1500 },
    new { Name = "キーボード", Price = 5000 },
    new { Name = "モニター", Price = 25000 },
    new { Name = "スピーカー", Price = 8000 }
};

この中から「価格が10000円以上の商品」を「価格の安い順」に並び替えて、「商品名だけ」を取り出してみましょう。

クエリ式


var result = from p in products
             where p.Price >= 10000
             orderby p.Price
             select p.Name;

foreach (var name in result)
{
    Console.WriteLine(name);
}

メソッド式


var result = products.Where(p => p.Price >= 10000)
                     .OrderBy(p => p.Price)
                     .Select(p => p.Name);

foreach (var name in result)
{
    Console.WriteLine(name);
}

モニター
ノートパソコン

このように、実際の業務でよくあるデータの絞り込みや並び替えも、クエリ式とメソッド式のどちらでも実現できます。ここで使ったnew { Name = "...", Price = ... }という書き方は、匿名型と呼ばれ、簡単なデータ構造を素早く作るときに便利です。

カテゴリの一覧へ
新着記事
New1
C#
C#のメモリ管理とガーベジコレクションの基礎を理解しよう
New2
C#
C#の参照型と値型の違いを初心者向けにやさしく解説!
New3
C#
C#のクエリ式とメソッド式の書き換え方を完全ガイド!LINQの2つの書き方をマスター
New4
C#
C#の戻り値にタプルを使う方法!複数の値を返すテクニック
人気記事
No.1
Java&Spring記事人気No1
C#
C#で文字列が数値か判定する方法を解説!char.IsDigitやTryParseの基本
No.2
Java&Spring記事人気No2
C#
C#のLINQでOrderByを使った並び替えを完全ガイド!初心者でもわかるソート方法
No.3
Java&Spring記事人気No3
C#
C#のpartialクラスとは?初心者でも理解できるクラス分割の基本
No.4
Java&Spring記事人気No4
C#
C#のrefとoutキーワードとは?引数の参照渡しを理解しよう
No.5
Java&Spring記事人気No5
COBOL
COBOLの数値データ型「PIC 9」の使い方と注意点をやさしく解説!
No.6
Java&Spring記事人気No6
C#
C#の引数と戻り値の基本!値を受け渡し・返す仕組みを理解しよう
No.7
Java&Spring記事人気No7
C#
C#のラムダ式の書き方と構文を初心者向けに完全解説
No.8
Java&Spring記事人気No8
C#
C#で型を調べる方法!GetType()・typeof演算子の違いと使い方