Construir uma consulta LINQ GroupBy usando árvores de expressão
Eu tenho preso neste problema por uma semana e nenhuma solução encontrada.
Eu tenho um POCO como abaixo:
public class Journal {
public int Id { get; set; }
public string AuthorName { get; set; }
public string Category { get; set; }
public DateTime CreatedAt { get; set; }
}
Eu quero saber durante um período específico (agrupados por meses ou anos) a quantidade de diários contados por um AuthorName ou uma categoria.
Depois de enviar o objeto consultado para o serializador JSON, os dados JSON gerados são mostrados abaixo (apenas usando JSON para demonstrar os dados que desejo obter, como serializar um objeto para um JSON não é problema meu)
data: {
'201301': {
'Alex': 10,
'James': 20
},
'201302': {
'Alex': 1,
'Jessica': 9
}
}
OU
data: {
'2012': {
'C#': 230
'VB.NET': 120,
'LINQ': 97
},
'2013': {
'C#': 115
'VB.NET': 29,
'LINQ': 36
}
}
O que eu sei é escrever uma consulta LINQ em "método de maneira" como:
IQueryable<Journal> query = db.GroupBy(x=> new
{
Year = key.CreatedAt.Year,
Month = key.CreatedAt.Month
}, prj => prj.AuthorName)
.Select(data => new {
Key = data.Key.Year * 100 + data.Key.Month, // very ugly code, I know
Details = data.GroupBy(y => y).Select(z => new { z.Key, Count = z.Count() })
});
As condições agrupadas por meses ou anos, AuthorName ou Category serão passadas por dois parâmetros do método do tipo string. O que eu não sei é como usar os parâmetros "Magic String" em um método GroupBy (). Depois de alguns googling, parece que não é possível agrupar dados passando uma string mágica como "AuthorName". O que devo fazer é construir uma árvore de expressão e passá-la para o método GroupBy ().
Qualquer solução ou sugestão é apreciada.