3

以下に簡単なコードを示します。

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

namespace LinqStuff
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            var aS = new List<A>();
            aS.Add(new A { aId = 0 });
            aS.Add(new A { aId = 1 });

        var bs = new List<B>();
        bs.Add(new B { aId = 0, bId = 0 });
        bs.Add(new B { aId = 0, bId = 1 });

        var cs = new List<C>();
        cs.Add(new C { bId = 0, cId = 0, Val = 100 });
        cs.Add(new C { bId = 0, cId = 1, Val = 100 });
        cs.Add(new C { bId = 1, cId = 2, Val = 100 });
        cs.Add(new C { bId = 1, cId = 3, Val = 100 });


    }
}

internal class A
{
    public int aId { get; set; }
}

internal class B
{
    public int aId { get; set; }
    public int bId { get; set; }
}

internal class C
{
    public int bId { get; set; }
    public int cId { get; set; }
    public int Val { get; set; }
}

}

私がやりたいことは、次のような2つの匿名オブジェクトを戻すalinqを用意することです:

最初: (援助 = 1, 合計 = 0) 2番目: (援助 = 0, 合計 = 400)

Sum は、B を介して A にリンクされているすべてのオブジェクト C の合計です。

SelectMany を試してみましたが、後でグループ化を実行する必要がある (A、C) の 5 つのペアを取得する以上のことはありません。

例えば

            var result = aS.SelectMany(a => bs.Where(b => b.aId == a.aId).DefaultIfEmpty(),
                                        (a, b) => new { A = a, B = b })
                            .SelectMany(b => cs.Where(c => b != null && b.B != null && c.bId == b.B.bId).DefaultIfEmpty(),
                                        (b, c) => new { A = b.A, C = c })

何かが足りないのですが、助けてもらえますか?

乾杯。

4

2 に答える 2

2

最も美しい Linq ステートメントではありませんが、これで十分です。

var result = aS.Select(a => 
  new { a.aId, 
        sum = cs.Where(c => bs.Where(b => b.aId == a.aId)
                .Select(b => b.bId)
                .Contains(c.bId))
                .Sum(c => c.Val) 
      }).ToList();
于 2012-09-04T14:07:25.417 に答える
0
var results = from a in aS
              let matchingBIds = bS.Where(b => b.aId == a.aId).Select(b => b.bId)
              let matchingCs = cS.Where(c => matchingBIds.Contains(c.bId))
              let Sum = matchingCs.Sum(c => c.Val)
              select new { a.aId, Sum };
于 2012-09-04T16:17:26.780 に答える