2009-06-30 92 views
1

我有以下物品。一個IEnumerable <Agency>代理機構,然後包含BusinessUnits和BusinessUnits包含客戶端:如何在此LINQ查詢中添加額外的項目?

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

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

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

我一直在使用這種查詢鞏固我的機構根據BusinessUnits這樣我就可以顯示「所有代理機構:」我的數據從去這樣的:

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

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

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

這樣:

All Agencies 
++BusinessUnit1 - $30 
++++Client1 - $10 
++++Client2 - $10 
++++Client5 - $5 
++++Client6 - $5 

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

我一直在使用下面的LINQ查詢可以這樣做:

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); 
    } 
} 

我的問題是:如何在返回的對象中包含BusinessUnit和Client的「Name」字段。截至目前,我所得到的BusinessUnits僅包含他們從分組關鍵字獲得的ID。

我還需要在查詢中能夠從BusinessUnit中返回「Name」,而不僅僅是它的ID。我不知道如何結合使用LINQ和分組。

+0

這一切都取決於該數據是從哪裏來的,但這裏是一個想法:您可能會考慮重組您目前的課程設計,因爲它涉及重複的信息(名稱,可能更多將來)。如何擺脫每個課程的集合和AmountSpent,並添加一個新的類如Expenditures(或更適合的東西)?這可以包含對每個參與機構,BusinessUnit和客戶的參考以及AmountSpent。這種方法應該使查詢和分組更容易,但可能會導致我在應用程序中不知道的其他問題。 – 2009-06-30 15:39:29

回答

2

你可以改變分組密鑰 - 這種假設不會有多個名字相同的ID或反之亦然:

var groupings = 
    from agency in agencies 
    from businessUnit in agency.BusinessUnits 
    from client in businessUnit.Clients 
    group client by new { businessUnit.ID, businessUnit.Name } into clients 
    select clients; 

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

@Jon Skeet,如果BusinessUnit類增長爲包含其他字段會怎樣?將它們添加到關鍵可行? – KingNestor 2009-06-30 15:25:13

相關問題