如何在单个 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 为真的对象。

有没有办法重组 LINQ 来实现这项工作?

编辑:我更喜欢流畅的语法风格,但我无法让上述内容工作。 任何变化的答案都会很棒。

您需要将条件传递给 Count 方法。

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

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

相关内容

  • 没有找到相关文章