【C#】LINQクエリ構文とメソッド構文

LINQクエリをメソッド構文で記述することももちろん可能です。メソッド構文を使う場合、通常はメソッドチェーンを用いてクエリを構成します。以下に、LINQクエリ構文とメソッド構文の両方の例を示します。

比較

LINQクエリ構文

var result = from item in collection
             where item.Property == value
             select item;

LINQメソッド構文

var result = collection.Where(item => item.Property == value);

メソッド構文の例をもう少し複雑にしてみましょう:

複雑なクエリ(メソッド構文)

例えば、フィルタリング、並べ替え、投影(select)のステップを含むクエリを考えてみます。

var result = collection
    .Where(item => item.Property == value)
    .OrderBy(item => item.OtherProperty)
    .Select(item => new { item.Property, item.OtherProperty });

複雑なクエリ(クエリ構文)

同じクエリをクエリ構文で記述すると次のようになります。

var result = from item in collection
             where item.Property == value
             orderby item.OtherProperty
             select new { item.Property, item.OtherProperty };

それぞれのメリット・デメリット

メソッド構文の利点

  1. チェーン化しやすい: メソッド構文はメソッドチェーンを用いるため、複数の操作を連続して記述しやすいです。
  2. 可読性: 特に簡単なクエリの場合、メソッド構文は短くて読みやすいことがあります。

クエリ構文の利点

  1. SQLに似ている: クエリ構文はSQLに似ているため、SQLに慣れている人にとっては直感的で理解しやすいです。
  2. 複雑なクエリ: クエリ構文は複雑なクエリを視覚的に整理しやすいことがあります。

選択のポイント

  • 簡単なクエリ: 簡単なフィルタリングや選択の操作では、メソッド構文が短くて読みやすいことが多いです。
  • 複雑なクエリ: 複数のフィルタリング、並べ替え、結合などを含む複雑なクエリでは、クエリ構文が視覚的にわかりやすいことがあります。

最終的には、プロジェクトのコーディング規約やチームの合意に従って選択すると良いでしょう。どちらのスタイルも正しい方法であり、一貫性が保たれていればどちらを使用しても問題ありません。

サンプルの解説

それでは、先ほどのLINQクエリのサンプルについて、詳細に説明します。

サンプルデータの準備

まず、サンプルのデータクラスとコレクションを準備します。

public class SampleItem
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Value { get; set; }
    public int OtherValue { get; set; }
}

var collection = new List<SampleItem>
{
    new SampleItem { Id = 1, Name = "Item1", Value = 10, OtherValue = 30 },
    new SampleItem { Id = 2, Name = "Item2", Value = 20, OtherValue = 20 },
    new SampleItem { Id = 3, Name = "Item3", Value = 10, OtherValue = 10 },
    new SampleItem { Id = 4, Name = "Item4", Value = 30, OtherValue = 40 }
};

LINQクエリ構文

var resultQuery = from item in collection
                  where item.Value == 10
                  orderby item.OtherValue
                  select new { item.Name, item.OtherValue };

クエリ構文の説明:

  1. from item in collectioncollection内の各要素をitemとして扱います。
  2. where item.Value == 10Valueプロパティが10のアイテムのみを選択します。
  3. orderby item.OtherValue: 残ったアイテムをOtherValueプロパティで昇順に並べ替えます。
  4. select new { item.Name, item.OtherValue }: 選択されたアイテムからNameOtherValueプロパティを持つ匿名型オブジェクトを作成します。

LINQメソッド構文

var resultMethod = collection
    .Where(item => item.Value == 10)
    .OrderBy(item => item.OtherValue)
    .Select(item => new { item.Name, item.OtherValue });

メソッド構文の説明:

  1. Where(item => item.Value == 10)Valueプロパティが10のアイテムのみをフィルタリングします。
  2. OrderBy(item => item.OtherValue): フィルタリングされたアイテムをOtherValueプロパティで昇順に並べ替えます。
  3. Select(item => new { item.Name, item.OtherValue }): 選択されたアイテムからNameOtherValueプロパティを持つ匿名型オブジェクトを作成します。

実行結果の表示

結果を表示するために、コンソールに出力するコードを追加します。

foreach (var item in resultQuery)
{
    Console.WriteLine($"Name: {item.Name}, OtherValue: {item.OtherValue}");
}

foreach (var item in resultMethod)
{
    Console.WriteLine($"Name: {item.Name}, OtherValue: {item.OtherValue}");
}

まとめ

  • LINQクエリ構文: SQLに似た構文で、複雑なクエリを視覚的に整理しやすい。
  • LINQメソッド構文: メソッドチェーンを使用し、短くて読みやすいコードを書くのに適している。

どちらの方法でも同じ結果を得ることができます。クエリが簡単であればメソッド構文、複雑であればクエリ構文を選ぶことが一般的です。いずれにせよ、一貫したスタイルを保つことが重要です。

C#

Posted by hidepon