Создайте запрос LINQ GroupBy, используя деревья выражений
Я застрял на этой проблеме в течение недели, и решение не найдено.
У меня есть POCO, как показано ниже:
public class Journal {
public int Id { get; set; }
public string AuthorName { get; set; }
public string Category { get; set; }
public DateTime CreatedAt { get; set; }
}
Я хочу знать в течение определенного промежутка времени (сгруппированного по месяцам или годам) количество журналов, подсчитываемых по AuthorName или категории.
После того, как я отправил запрошенный объект в сериализатор JSON, он сгенерировал данные JSON, как показано ниже (использование JSON для демонстрации данных, которые я хочу получить, не является проблемой для сериализации объекта в JSON)
data: {
'201301': {
'Alex': 10,
'James': 20
},
'201302': {
'Alex': 1,
'Jessica': 9
}
}
ИЛИ ЖЕ
data: {
'2012': {
'C#': 230
'VB.NET': 120,
'LINQ': 97
},
'2013': {
'C#': 115
'VB.NET': 29,
'LINQ': 36
}
}
То, что я знаю, это написать запрос LINQ «методом», например:
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() })
});
Условия, сгруппированные по месяцам или годам, AuthorName или Category, будут переданы двумя параметрами метода строкового типа. Чего я не знаю, так это как использовать параметры «Magic String» в методе GroupBy (). После некоторого поиска в Google кажется, что я не могу сгруппировать данные, передавая волшебную строку, такую как «AuthorName». Что мне нужно сделать, это построить дерево выражений и передать его в метод GroupBy ().
Любое решение или предложение приветствуется.