我有一个这个对象的列表:
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)
});