2009-06-29 22 views
0

我有以下對象:如何在C#/ LINQ中獲取以下數據結構的不同項目?

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>含有幾個機構,這些機構包含幾個BusinessUnits,而那些BusinessUnits包含幾個客戶。

它看起來是這樣的:

Agency1
++ BusinessUnit1 - $ 20
++++客戶端1 - $ 10
++++客戶端2 - $ 10

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

Agency 3
++ BusinessUnit1 - $ 10
++++客戶機程序 - $ 5
++++ Client6 - $ 5
++ BusinessUnit2 - $ 25
++++客戶端1 - $ 25

現在,我期望做的是創建一個BusinessUnits和Clients的列表,但是對於所有機構而言,沒有重複。

所以,我希望把機構的該名單爲:

所有代理商
++ BusinessUnit1 - $ 30
++++客戶端1 - $ 10
++++客戶端2 - $ 10
++++客戶機程序 - $ 5
++++ Client6 - $ 5

++ BusinessUnit2 - $ 45
++++客戶端1 - $ 20
++++客戶端1 - $ 25

如果我只是有獨特BusinessUnits的列表(與整個特定BusinessUnit的所有實例的正確AmountSpent總),並與他們在獨特的客戶列表,該業務單位下該特定客戶的每個實例的正確金額總額。

是否有可能與LINQ,我可以查詢我的IEnumerable <Agency>機構列表返回正確的總和我清楚的BusinessUnit /客戶端組合列表?

+0

@Alan,正確。 Agency.BusinessUnits只有每個BusinessUnitID – KingNestor 2009-06-29 22:40:34

+0

@Alan中的一個,但是,您可能在兩個不同的BusinessUnits中的兩個不同位置中有Client1。 – KingNestor 2009-06-29 22:41:08

回答

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。


在第二讀它看起來像你可能不想崩潰客戶業務部門之下,但保持每個實例中,你可以擺脫b.SelectMany的這種情況下,(B2 => b2.Clients)和一切遵循並僅使用b.Clients。

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); 
    } 
} 
相關問題