やってみる

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

C#の概念 LINQ(複合キー結合)

 エラーが出てできなかった。

成果物

コード

class Person
{
    public string Name { get; set; }
    public int GenerateId { get; set; }
}
class Pet
{
    public string Name { get; set; }
//        public Person Owner { get; set; }
    public string OwnerName { get; set; }
    public int GenerateId { 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", GenerateId=1 },
            new Person { Name="A", GenerateId=2 },
            new Person { Name="B", GenerateId=1 },
            new Person { Name="C", GenerateId=1 },
        };
    }
    private List<Pet> CreatePets() {
        return new List<Pet>() {
            new Pet { Name="a", OwnerName=persons[0].Name, GenerateId=1 },
            new Pet { Name="b", OwnerName=persons[0].Name, GenerateId=1 },
            new Pet { Name="c", OwnerName=persons[1].Name, GenerateId=1 },
            new Pet { Name="d", OwnerName=persons[0].Name, GenerateId=2 },
            new Pet { Name="z", OwnerName=null,            GenerateId=1 },
        };
    }
    private IEnumerable<dynamic> Query() {
        return  from person in persons
                join pet in pets on new {person.Name, person.GenerateId} equals new {pet.OwnerName, pet.GenerateId} into gj
//                    join pet in pets on new {Name=person.Name, GenId=person.GenerateId} equals new {Name=pet.OwnerName, GenId=pet.GenerateId} into gj
                from pet in gj
                select new {
                    person.Name,
                    person.GenerateId,
                    PetName=pet.Name
//                        pet.GenId,
//                        PetName=pet.Name,
                };
    }
    private void Show(in IEnumerable<dynamic> query) {
        foreach (var item in query) {
            Console.WriteLine($"Person.Name={item.Name}, GenId={item.GenId}, PetName={item.PetName}");
        }
    }
}
lesson0/Main.cs(45,21): error CS1941: The type of one of the expressions in the join clause is incorrect.  Type inference failed in the call to 'GroupJoin'.

 以下の行にて、型が一致していないとか言っているっぽい。一致していると思うのだが? 謎。解決できなかった。

join pet in pets on new {person.Name, person.GenerateId} equals new {pet.OwnerName, pet.GenerateId} into gj

所感

 できるまでやりたかったけど、わからんかったので飛ばす。

対象環境

$ uname -a
Linux raspberrypi 4.19.75-v7l+ #1270 SMP Tue Sep 24 18:51:41 BST 2019 armv7l GNU/Linux