やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

C#の概念 LINQ(内部結合)

 SQLと同じJOIN句。

成果物

情報源

コード

using System;
using System.Collections.Generic;
using System.Linq;

class Person
{
    public string Name { get; set; }
}
class Pet
{
    public string Name { get; set; }
    public Person Owner { get; set; }
}
class Main {
    private List<Person> persons;
    private List<Pet> pets;
    public void Run() {
        persons = CreatePersons();
        pets = CreatePets();
        Show(Query());
    }
    private List<Person> CreatePersons() {
        return new List<Person>() {
            new Person { Name="A" },
            new Person { Name="B" },
        };
    }
    private List<Pet> CreatePets() {
        return new List<Pet>() {
            new Pet { Name="a", Owner=persons[0] },
            new Pet { Name="b", Owner=persons[0] },
            new Pet { Name="c", Owner=persons[1] },
        };
    }
    private IEnumerable<dynamic> Query() {
        return  from person in persons
                join pet in pets on person equals pet.Owner
                select new { OwnerName=person.Name, PetName=pet.Name};
    }
    private void Show(in IEnumerable<dynamic> query) {
        foreach (var item in query) {
            Console.WriteLine($"OwnerName={item.OwnerName}, PetName={item.PetName}");
        }
    }
}
OwnerName=A, PetName=a
OwnerName=A, PetName=b
OwnerName=B, PetName=c

所感

 ポイントはjoin

from person in persons
join pet in pets on person equals pet.Owner
select new { OwnerName=person.Name, PetName=pet.Name };

 SQLで書くと以下。

SELECT
  person.Name,
  pet.Name
FROM
  Persons person
  INNER JOIN Pets pet 
  ON person.id = pet.owner_id;

 LINQid列が不要。そのままインスタンスで指定できるので読みやすい。

対象環境

$ uname -a
Linux raspberrypi 4.19.42-v7+ #1218 SMP Tue May 14 00:48:17 BST 2019 armv7l GNU/Linux