У меня есть список объектов, возвращаемых из базы данных, которые выглядят следующим образом при сериализации с использованием JSON.NET:
"[{"Percentage":0.78, "PartCode":"D40", "InspectionCode":"292", "Make":"TOYOTA"}]
{"Percentage":0.18, "PartCode":"6N", "InspectionCode":"292", "Make":"GM"},
{"Percentage":0.57, "PartCode":"6N", "InspectionCode":"F", "Make":"GM"},
{"Percentage":0.49, "PartCode":"D40", "InspectionCode":"F", "Make":"TOYOTA"},
{"Percentage":0.09, "PartCode":"785", "InspectionCode":"KB", "Make":"CHRYSLER"},
{"Percentage":0.09, "PartCode":"705", "InspectionCode":"KB", "Make":"FORD"},
{"Percentage":0.18, "PartCode":"D40", "InspectionCode":"KB", "Make":"TOYOTA"},
{"Percentage":0.61, "PartCode":"D40", "InspectionCode":"KB", "Make":"TOYOTA"},
{"Percentage":0.39, "PartCode":"705", "InspectionCode":"SB", "Make":"FORD"},
{"Percentage":0.31, "PartCode":"6N", "InspectionCode":"SB", "Make":"GM"},
{"Percentage":0.21, "PartCode":"AW7", "InspectionCode":"XE1", "Make":"CHRYSLER"},
{"Percentage":0.27, "PartCode":"705", "InspectionCode":"XE1", "Make":"FORD"},
{"Percentage":0.28, "PartCode":"UX", "InspectionCode":"XE1", "Make":"FORD"},
{"Percentage":0.56, "PartCode":"D40", "InspectionCode":"XE1", "Make":"TOYOTA"}]"
Мне нужно создать два массива JSON в этом формате для перехода в HighCharts:
var categories = [
{name: "Toyota", categories: ['D40']},
{name: "GM", categories: ['6N']},
{name: "FORD", categories: ['705', 'UX']},
{name: "CHRYSLER", categories: ['AW7','785']}];
var series = [
{name: "292", data = [0.78, 0.18]}
{name: "F", data = [0.57, 0.49]},
{name: "KB", data = [0.09, 0.09, 0.18, 0.61]},
{name: "SB", data = [0.39, 0.31]},
{name: "XE1", data = [0.21, 0.27, 0.28, 0.56]}];
Пока я делаю вложенную группировку данных, поскольку Make и PartCode являются иерархическими данными.
var query = from d in sortedData
group d by d.Make into newgroup1
from newgroup2 in
(from e in newgroup1
group e by e.PartCode)
group newgroup2 by newgroup1.Key;
Я могу видеть данные в иерархическом формате, используя:
foreach (var outergroup in query)
{
System.Diagnostics.Debug.WriteLine(outergroup.Key);
foreach (var innergroup in outergroup)
{
System.Diagnostics.Debug.WriteLine(innergroup.Key);
foreach (var innerGroupElement in innergroup)
{
System.Diagnostics.Debug.WriteLine("\t\t{0} {1}", innerGroupElement.InspectionCode, innerGroupElement.Percentage);
}
}
}
Но мне трудно понять, что делать дальше, чтобы добраться до желаемых массивов JSON. Какие шаги я должен предпринять для этого?
2 ответа
Это даст вам то, что вы хотите. Как только вы сгруппируете по Make или InspectionCode, все элементы в этом подсписке будут содержать данные, которые вы ищете.
var categories = sortedData.GroupBy(d => d.Make)
.Select(g => new
{
name = g.Key,
categories = g.Select(x => x.PartCode).ToArray()
});
var series = sortedData.GroupBy(d => d.InspectionCode)
.Select(g => new
{
name = g.Key,
data = g.Select(x => x.Percentage).ToArray()
});
var categoriesAsJson = Newtonsoft.Json.JsonConvert.SerializeObject(categories);
var seriesAsJson = Newtonsoft.Json.JsonConvert.SerializeObject(series);
Если у вас есть данные уже в памяти, преобразовать их в Json так же просто, как и в последних двух строках, используя Json.NET < / а>. Если вы отправляете это по сети через конечную точку WebAPI, то вы можете просто заставить конечную точку возвращать список, который будет объектами списка категорий или серий без преобразования их в JSON.
[HttpGet]
public HttpResponseMessage GetCategories()
{
var categories = GetCategoriesUsingAboveCode();
return Request.CreateResponse(HttpStatusCode.OK, categories);
}
Что-то такое?
var categories = sortedData
.GroupBy(i => i.Make)
.Select(g => new
{
name = g.Key,
categories = sortedData
.Where(i2 => i2.Make == g.Key)
.Select(i2 => i2.InspectionCode)
});
Похожие вопросы
Новые вопросы
c#
C # (произносится как «резкий») - это высокоуровневый, статически типизированный язык программирования с несколькими парадигмами, разработанный Microsoft. Код C # обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, включая, среди прочего, .NET Framework, .NET Core и Xamarin. Используйте этот тег для вопросов о коде, написанном на C # или в формальной спецификации C #.