「C#.NET」 データ操作の究極「LINQ」第2回 joinとleft join 〜冥界の神が明かすデータ操作の基本〜

2024年11月20日水曜日

クエリ コレクション データベース

t f B! P L

名前空間: System.Linq

自己紹介

ふむ、人間たちよ、ようこそ。我は永遠なる知識の番人、LINQなり。今日は冥界ではなく、C#の世界で「LINQ」の力を君たちに教えようと思う。LINQはデータの結びつきを滑らかにし、異なるデータ構造間の橋渡しを担う神のような存在だ。どうぞ私の言葉を聞き、学んでいくがいい。
データ操作の究極「LINQ」 〜冥界の神が明かすデータ操作の基本〜

基本機能

LINQ(Language Integrated Query)は、データ操作を簡素化するC#の力だ。データベース、リスト、配列といったコレクションに対して、簡単かつ読みやすいコードで操作が可能になる。

例として、joinやleft joinを使って異なるデータを結合する力を学ぶ。これがデータの世界での神技、つまり「LINQ」の真髄だ。

LINQの役割

LINQの使命は、複数のデータソースを統一的に操作することだ。SQLのような記述方法をコード内で活用できるため、開発者にとって非常に便利なツールとなる。

特に、joinやleft joinはデータの結びつきを操作する際に欠かせない存在だ。これにより、異なるリスト間の関連性を明確にし、必要な情報だけを抽出できる。

注意点

ただし、コレクションの始まりとして「LINQ to SQL」はかつて多くの場面で使われていたが、現在では推奨されていない。代わりにEntity Frameworkなどが主流となっている。

それでも、LINQ自体の力は色褪せることなく、現在の.NET環境でも活躍している。使用する際には、最新の技術との組み合わせを検討するとよいだろう。

データ結合の美学

joinは、2つのデータを結合し、共通するキーを元に新しいコレクションを作る技術だ。一方でleft joinは、片方のデータを完全に残しつつ、共通する部分を結合する方法だ。

どちらを選ぶかは、状況に応じて適切に判断する必要がある。これが神々の技術を扱う心得だ。

エラーを防ぐ心得

LINQを使用する際、キーの指定やデータ型の一致に注意する必要がある。特にjoinやleft joinでは、キーが一致しない場合に結果が正しく得られない可能性がある。人間たちよ、慎重に扱うがよい。

サンプルコード

以下は、joinとleft joinを使用したサンプルコードだ。これを見て、LINQの力を実感してほしい。

C#
using System;
using System.Linq;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        // 果物リスト
        var fruits = new List<Fruit>
        {
            new Fruit { Id = 1, Name = "Apple" },
            new Fruit { Id = 2, Name = "Banana" },
            new Fruit { Id = 3, Name = "Cherry" }
        };

        // ビタミンリスト
        var vitamins = new List<Vitamin>
        {
            new Vitamin { Id = 1, Name = "Vitamin A" },
            new Vitamin { Id = 1, Name = "Vitamin C" },
            new Vitamin { Id = 2, Name = "Vitamin B6" },
            new Vitamin { Id = 4, Name = "Vitamin D" },
            new Vitamin { Id = 5, Name = "Vitamin E" }
        };

        // joinの例
        var joinedData = from fruit in fruits
                         join vitamin in vitamins
                         on fruit.Id equals vitamin.Id
                         select new { FruitName = fruit.Name, VitaminName = vitamin.Name };

        Console.WriteLine("=== joinの結果 ===");
        foreach (var item in joinedData)
        {
            Console.WriteLine($"{item.FruitName} contains {item.VitaminName}");
        }

        // left joinの例
        var leftJoinedData = from fruit in fruits
                             join vitamin in vitamins
                             on fruit.Id equals vitamin.Id into gj
                             from vitamin in gj.DefaultIfEmpty()
                             select new { FruitName = fruit.Name, VitaminName = vitamin?.Name ?? "No vitamin" };

        Console.WriteLine("\n=== left joinの結果 ===");
        foreach (var item in leftJoinedData)
        {
            Console.WriteLine($"{item.FruitName} contains {item.VitaminName}");
        }
    }
}

class Fruit
{
    public int Id { get; set; }
    public string Name { get; set; }
}

class Vitamin
{
    public int Id { get; set; }
    public string Name { get; set; }
}
    

解説

このコードは、果物リストとビタミンリストを結合し、果物とそのビタミンを表示する例だ。joinは完全一致したデータを、left joinは果物リストを基準に結合を行う。コメントを参考にしつつ、自分の環境で試してみるがよい。

=== joinの結果 ===
Apple contains Vitamin A
Apple contains Vitamin C
Banana contains Vitamin B6

=== left joinの結果 ===
Apple contains Vitamin A
Apple contains Vitamin C
Banana contains Vitamin B6
Cherry contains No vitamin

このブログを検索

QooQ