Я пытаюсь настроить многополосную гистограмму с данными, поступающими из запроса. На многополосной диаграмме я пытаюсь показать среднее время для разных компаний по нескольким statusID (т.е. компании 1-15 будут показывать средние значения времени для всех statusID 1-10.
Чтобы выполнить sh это раньше я сначала создавал массивы с длиной всех отдельных идентификаторов статуса, а затем добавлял данные из запроса в зависимости от компании и statusID (со значениями «0» для среднего времени, если statusID для этой компании не имел значений). Когда я использовал этот метод, я добавил данные для диаграммы js следующим образом:
var sDeliverySupports = @Html.Raw(Json.Encode(ViewBag.ServiceDeliverySupports)); //Ordered list of company names
var sDeliveryTimes = @Html.Raw(Json.Encode(ViewBag.ServiceDeliveryTimes)); //Ordered list of arrays containing the average times for each company for all statusIDs
try {
//bar chart
var ctx = document.getElementById("serviceReport");
if (ctx) {
ctx.height = 75;
var myData = []; //array to hold the
var x = Math.random.next
sDeliverySupports.forEach(function (a, i) {
myData.push(
{
label: sDeliverySupports[i], //the name of the company
data: sDeliveryTimes[i], //the array at index i of the sDeliveryTimes list
borderColor: "rgba(255, 255, 255, 0.9)",
borderWidth: "0",
backgroundColor: "rgba(0, 123, 255, 0.9)",
fontFamily: "Poppins"
}
)
});
var myChart = new Chart(ctx, {
type: 'bar',
defaultFontFamily: 'Poppins',
data: {
labels: @Html.Raw(Json.Encode(ViewBag.TicketStatuses)), //list of the statusIDs
datasets: myData
},
.
.
.
Бэкэнд для этого был примерно таким:
List<companyName, int[# of statuses] avgTimes> timeList; //result
for every company
{
for every status
{
if data for the status exists
get the times for this status and add the avg to avgTimes[StatusID]
else
add a 0 value in
}
add companyName + the array of times to timeList;
}
//And then I split the result into Viewbags to feed into the chart data
ViewBag.ServiceDeliverySupports = select the company names
ViewBag.ServiceDeliveryTimes = select array of company times
Это сработало. потому что даже если в моем запросе не было значений для определенного идентификатора статуса, я все равно добавил его в массив, чтобы значение соответствовало правильному статусу на диаграмме. Поскольку это было слишком неэффективно, я теперь работаю с представление, в котором есть все данные, и я сгруппировал его по полю компании и полю statusID, поэтому у меня есть список всех времен для каждой компании и для statusID, bu t не каждый statusID имеет данные для него, поэтому моя проблема в том, что мне нужно найти более эффективный способ добавить 0 значений для statusID без данных для каждой компании, чтобы я мог ввести этот список в гистограмму или другой способ подойти к этой проблеме.
var statusTimes = qry.GroupBy(g => new { g.VendorName, g.LogStatus }).Select(g =>
new VendorAvgStatusTime { VendorName = g.Key.VendorName, Status = g.Key.LogStatus, AvgTime = g.Average(a => a.LogTime) }).OrderBy(x => x.VendorName).ThenBy(x => x.Status);
Сообщите мне, если что-то нужно прояснить. Я много пытался искать решения в Интернете, но мне кажется, что трудно объяснить проблему несколькими словами. Я пытался избежать внутренних циклов for, потому что мне казалось, что именно поэтому мой исходный код выполнялся так долго.