Как я могу получить два разных агрегата в одном LINQ? - PullRequest
4 голосов
/ 10 мая 2011

У меня есть список этого объекта:

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, чтобы эта работа работала?

Редактировать: я бы предпочел свободный стиль синтаксиса, ноЯ не смог заставить вышеуказанное работать.Ответ в любом варианте был бы отличным.

Ответы [ 2 ]

3 голосов
/ 10 мая 2011

Необходимо передать условие в метод Count.

Purchased = g.Count(q => q.BillingStartDate.HasValue)
2 голосов
/ 10 мая 2011

Таким образом, у 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)
                                });
...