0

私は次のオブジェクトを持っています:

public class Agency  
{   
    public int ID; 
    public IEnumerable<BusinessUnit> BusinessUnits;  
}  

public class BusinessUnit
{
    public int ID;  
    public decimal AmountSpent;
    public IEnumerable<Client> Clients;
}

public class Client
{
    public int ID;  
    public decimal AmountSpent;
}

これで、複数のエージェンシーを含むIEnumerable <Agency>があり、これらのエージェンシーには複数のBusinessUnitが含まれ、それらのBusinessUnitには複数のクライアントが含まれています。

次のようになります。

Agency1
++ BusinessUnit1-$ 20
++++ Client1-$ 10
++++ Client2-$ 10

Agency2
++ BusinessUnit2-$ 20
++++ Client1-$ 20

Agency3
++ BusinessUnit1-$ 10
++++ Client5-$ 5
++++ Client6-$ 5
++ BusinessUnit2-$ 25
++++ Client1-$ 25

今、私が探しているのは、BusinessUnitsとClientsのリストを作成することですが、すべてのエージェンシーに対して、重複はありません。

だから、私はそのエージェンシーのリストを次のように変えたいと思っています:

すべてのエージェンシー
++BusinessUnit1-$30
++++ Client1-$ 10 ++++ Client2-
$ 10
++++ Client5-$ 5
++++ Client6-$ 5

++ BusinessUnit2-$ 45
++++ Client1-$ 20
++++ Client1-$ 25

ここで、一意のBusinessUnitのリスト(その特定のBusinessUnitのすべてのインスタンスにわたる正しいAmountSpentの合計)と、その下の一意のクライアントのリスト、そのビジネスユニットの下のその特定のクライアントの各インスタンスの正しいAmountSpentの合計があります。 。

LINQを使用して、IEnumerable <Agency> Agenciesリストをクエリして、正しい合計でBusinessUnit / Clientの組み合わせの個別のリストを返すことはできますか?

4

2 に答える 2

2

このようなもの、私は考えます(テストされていません):

var res = agencies.SelectMany(a => a.BusinessUnits)
                  .GroupBy(b => b.ID)
                  .Select(b => new BusinessUnit { 
                     ID = b.Key, 
                     AmountSpent = c.Sum(b2 => b2.AmountSpent),
                     Clients = b.SelectMany(b2 => b2.Clients)
                                .GroupBy(c => c.ID)
                                .Select(c => new Client { 
                                   ID = c.Key, 
                                   AmountSpent = c.Sum(c2 => c2.AmountSpent) 
                                 })
                   });

匿名クラスの作成を最適化する方法があるかもしれません。それはあなたに任せます。 BusinessUnit.AmountSpent が正しいと仮定すると、おそらくクライアントの AmountSpent を合計する必要はありません。


2 回目の読み取りでは、クライアントをビジネス ユニットの下に折りたたむのではなく、各インスタンスを保持する必要があるように見えます。その場合、b.SelectMany(b2 => b2.Clients) とそれに続くすべてのものを取り除き、b.クライアント。

于 2009-06-29T22:42:49.027 に答える
1
var groupings =
    from agency in agencies
    from businessUnit in agency.BusinessUnits
    from client in businessUnit.Clients
    group client by businessUnit.ID into clients
    select clients;

var businessUnits =
    from grouping in groupings
    select new
    {
        ID = grouping.Key,
        AmountSpent = grouping.Sum(client => client.AmountSpent),
        Clients = grouping
    };

Console.WriteLine("All Agencies");

foreach (var businessUnit in businessUnits)
{
    Console.WriteLine("++BusinessUnit{0} - ${1}",
                      businessUnit.ID,
                      businessUnit.AmountSpent);

    foreach (var client in businessUnit.Clients)
    {
        Console.WriteLine("++++Client{0} - ${1}", client.ID, client.AmountSpent);
    }
}
于 2009-06-30T12:09:36.657 に答える