-1

こんなに長い間Linqを使用していて、これを理解できないとは信じがたいです...以前にやったに違いありませんが、私の脳は私に失敗しています.

やりたいことの要点は

from a in A
join b in B on a.aId equals b.aId into Bees
join c in C on b.bId equals c.bId into Cees
select new { a.id, Bees, Cees }

これを行うことができますか?「シンボルbを解決できません」と表示され、c結合条件でbをBeesに変更すると、もちろんそれはコレクションなので、IDで結合できません...

4

2 に答える 2

4
from a in A
join b in B
on a.aId equals b.aId into Bees
from bs in Bees
join c in C 
on bs.bId equals c.bId into Cees
select new { a.Id, Bees, Cees };

クラス定義

class AA
{
    public int Id { get; set; }
    public int aId { get; set; }
}

class BB
{
    public int Id { get; set; }
    public int aId { get; set; }
    public int bId { get; set; }
}

class CC
{
    public int Id { get; set; }
    public int bId { get; set; }
}

メインプログラム

class Program
{
    static void Main(string[] args)
    {
        var A = new List<AA>();
        var B = new List<BB>();
        var C = new List<CC>();

        // make up some data
        var bid = 1;
        var cid = 1;
        for (var a = 1; a < 4; a++)
        {
            A.Add(new AA { Id = a, aId = a });

            for (var b = 1; b < 4; b++)
            {
                B.Add(new BB { Id = bid++, aId = a, bId = b });

                for (var c = 1; c < 4; c++)
                    C.Add(new CC { Id = cid++, bId = b });
            }
        }

        // display the item count for each list
        Console.WriteLine("A: {0}", A.Count());
        Console.WriteLine("B: {0}", B.Count());
        Console.WriteLine("C: {0}", C.Count());

        // define the query
        var abc = from a in A
                  join b in B
                  on a.aId equals b.aId into Bees
                  from bs in Bees
                  join c in C 
                  on bs.bId equals c.bId into Cees
                  select new { a.Id, Bees, Cees };

        // display the results of the query in the console
        foreach (var x in abc)
        {
            var bees = x.Bees.Count();
            var cees = x.Cees.Count();
            var str = String.Format("Id: {0}, Bees: {1}, Cees: {2} ", x.Id, bees, cees);
            Console.WriteLine(str);
        }
     }
}

出力

A: 3
B: 9
C: 27

Id: 1, Bees: 3, Cees: 9
Id: 1, Bees: 3, Cees: 9
Id: 1, Bees: 3, Cees: 9
Id: 2, Bees: 3, Cees: 9
Id: 2, Bees: 3, Cees: 9
Id: 2, Bees: 3, Cees: 9
Id: 3, Bees: 3, Cees: 9
Id: 3, Bees: 3, Cees: 9
Id: 3, Bees: 3, Cees: 9
于 2013-03-15T16:55:21.770 に答える
1

join cコレクションにあるため、行に到達するまでにb存在しないことに注意してくださいBees。の ID 以外の ID でa参加しているため、参加する ID は 1 つだけではありません。Bees のコレクションごとに b を c と結合する必要があります。

from a in A
join b in B on a.aId equals  b.aId into Bees
select new { a.id, Bees, 
    Cees = from b in Bees 
    join c in C on b.bId equals c.bId
    select v}

これがグループ結合ではなく、通常の結合を行っている場合は、より理にかなっています。

from a in A
join b in B on a.aId equals b.aId
join c in C on b.bId equals c.bId
select new { a.id, b, c}

問題のコンテキストがわからないため、これが真の問題の解決に役立つかどうかを判断するのは困難です。

于 2013-03-15T17:00:23.380 に答える