2011-05-10 73 views
4

我有這個對象的列表:如何在一個LINQ中獲得兩個不同的聚合?

public class Customer 
{ 
    public int Id { get; set; } 
    public string EmailAddress { get; set; } 
    public DateTime ServiceStartDate { get; set; } 
    public DateTime? BillingStartDate { get; set; } 
    public string Status { get; set; } 
} 

在製作圖表製劑顯示在儀表盤上我試圖凝聚這份名單到這個對象的另一個列表:

public class DashboardCustomerConversions 
{ 
    public string Month { get; set; } 
    public int Trials { get; set; } 
    public int Purchased { get; set; } 
} 

凡最終的結果看起來是這樣:

Month  Trials Purchases 
--------- ------ --------- 
Dec 2010 390  250 
Jan 2011 345  190 
Feb 2011 576  340 

我有一個很難拿出一個LINQ聲明能達到期望的最終結果。這種說法是非常接近:

var list = from b in results 
      group b by new { b.ServiceStartDate.Year, b.ServiceStartDate.Month } into g 
      select new Test 
         { 
          Month = string.Format("{0} {1}", CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(g.Key.Month), g.Key.Year), 
          Trials = g.Count(), 
          Purchased = g.Count() 
         }; 

中最明顯的問題是「購買= g.Count()」行,它只是重複的試驗結果。我想計算BillingStartDate.HasValue爲true的對象。

有沒有一種方法來重構LINQ來完成這項工作?

編輯:我寧願流利的語法風格,但我無法得到上述工作。任何變化的答案都會很好。

回答

3

您需要將條件傳遞給Count方法。

Purchased = g.Count(q => q.BillingStartDate.HasValue) 
+0

唉!我很親密。我一直試圖通過「b」或「g」知道這是錯誤的,但無法提出更好的東西。我仍然吮吸lambda。謝謝。 – 2011-05-10 13:36:46

2

所以SLaks有正確的解決方案。這裏寫的是流利的語法

listOfCustomer.GroupBy(c => new { c.ServiceStartDate.Year, c.ServiceStartDate.Month }) 
       .Select(group => new DashboardCustomerConversions() 
           { 
            Month = string.Format("{0} {1}", CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(group.Key.Month), group.Key.Year), 
            Trials = group.Count(), 
            Purchased = group.Count(c => c.BillingStartDate.HasValue) 
           }); 
相關問題