linq groupby Months y agregue los meses que faltan a los datos agrupados

He creado una statement de linq que parece estar funcionando bien. Puede o no haberlo escrito correctamente sin embargo, está devolviendo mis resultados esperados.

var grouped = RewardTransctions.GroupBy(t => new { t.PurchaseDate.Value.Month }).Select(g => new TransactionDetail() { Month = g.Where(w=>w.EntryType==1).Select( (n => n.PurchaseDate.Value.Month)) .First(), TransactionAmount = g.Count() }); 

Ahora los resultados están devolviendo 5 valores agrupados por meses. ¿Es posible agregar los otros 7 meses faltantes con un TransactionAmount = 0 para ellos?

La razón de mi locura es que estoy tratando de vincular estos valores a un gráfico y tener mi eje x basado en meses. Actualmente solo muestra los 5 meses de récords. Si mis datos no devuelven ningún valor durante un mes, de alguna manera quiero agregar el valor 0.

¿Alguna sugerencia?

Es muy simple si usas .ToLookup(...) .

 var lookup = (from w in RewardTransctions where w.EntryType == 1 select w).ToLookup(w => w.PurchaseDate.Value.Month); var grouped = from m in Enumerable.Range(1, 12) select new TransactionDetail() { Month = m, TransactionAmount = lookup[m].Count(), }; 

¿Cómo es eso para un par de consultas LINQ simples?

Cuando estás usando LINQ to Objects, esta consulta debería hacer el truco:

 var grouped = from month in Enumerable.Range(1, 12) select new TransactionDetail() { Month = month, TransactionAmount = RewardTransactions .Where(t => t.PurchaseDate.Value.Month == month).Count() }; 

RewardTransactions embargo, cuando RewardTransactions es un IQueryable , primero debe llamar a AsEnumerable() .

¿Por qué no hacerlo así?

 var grouped = RewardTransctions.GroupBy(t => t.PurchaseDate.Value.Month).Select( g => new TransactionDetail { Month = g.Key, TransactionAmount = g.Count() }).ToList(); for (var i = 1; i <= 12; ++i) { if (grouped.Count(x => x.Month == i) == 0) { grouped.Add(new TransactionDetail { Month = i, TransactionAmount = 0 }); } } 

No es del todo LINQ, pero es sencillo. También simplifiqué un poco tu consulta de LINQ 😉

Supongo que si no usa un anonymoustype (var), pero crea un tipo personalizado y hace un .ToList () en su consulta, puede usar .Add () en su lista y vincular el gráfico a la lista.